分享
 
 
 

一次重构导向设计模式的实践(.NET)

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

代码仅仅是说明问题,和实际的有所不同

在项目开发过程中,有这样的需求:定义一个查询窗体使用DataGrid显示列表

双击Grid后打开指定记录的编辑页面,窗体类为FormSearchEntity于是这么写了

private void Grid_DoubleClick(object sender,System.EventArgs e)

{

string entityID = 双击记录的ID字段值; //这个有固定的办法

FormEntity frmEntity = new FormEntity(entityID);

........

frmEntity.Show();

}

其中的FormEntity就是对业务实体的编辑界面,在构造函数中传入一个ID,然后

加载该记录的相关数据,在这里不作重点解释。

接下来有要在查询界面上添加一个按钮“Go”,执行的动作和Grid双击是一样的,就是

在Grid中选中记录,点击Go打开实体的操作界面。

这样,就使用重构中的Extract Method手法:

private void Grid_DoubleClick(object sender,System.EventArgs e)

{

string entityID = 双击记录的ID字段值;

OpenEntityForm(entityID);

}

private void btnGo_Click(object sender,System.EventArgs e )

{

string entityID = 双击记录的ID字段值;

OpenEntityForm(entityID);

}

private void OpenEntityForm(string entityID)

{

FormEntity frmEntity = new FormEntity(entityID);

........

frmEntity.Show();

}

到现在看来,这样作有什么用呢?直接在Go的Click时间中调用Grid的DoubleClick不就行了吗?事实上Extract Method不仅仅是防止重复代码

同时也可以提高代码的可重用性,作用在下面会看到。

现在,又要对另一个的表进行同样的操作,那就再定义一个窗体,把上面的代码改改就成了,但是就出现了重复代码,这是不好的味道。那么这样作:把OpenEntityForm方法改为Virtual,同时声明为Protected,里面的代码都去掉

protected void OpenEntityForm(string entityID)

{

}

把窗体更名为FormSearchEntityBase再重新写一个类FormSearchEntityA来继承FormSearchEntityBase,override父类的OpenEntityForm方法

protected override void OpenEntityForm(string entityID)

{

FormEntityA frmEntityA = new FormEntityA(entityID);

........

frmEntityA.Show();

}

实体B的查询界面也一样FormSearchEntityB继承自FormSearchEntityBase,override父类的OpenEntityForm方法

protected override void OpenEntityForm(string entityID)

{

FormEntityB frmEntityB = new FormEntityB(entityID);

........

frmEntityB.Show();

}

这样,如果后面还有相同的需求,就从FormSearchEntityBase继承一个类,override父类的OpenEntityForm方法就可以了

现在,来看看TemplateMethod模式

意图:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

适用性:

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复

控制子类扩展

例子代码:

namespace TemplateMethod_DesignPattern

{

using System;

class Algorithm

{

public void DoAlgorithm()

{

Console.WriteLine("In DoAlgorithm");

// do some part of the algorithm here

// step1 goes here

Console.WriteLine("In Algorithm - DoAlgoStep1");

// . . .

// step 2 goes here

Console.WriteLine("In Algorithm - DoAlgoStep2");

// . . .

// Now call configurable/replacable part

DoAlgoStep3();

// step 4 goes here

Console.WriteLine("In Algorithm - DoAlgoStep4");

// . . .

// Now call next configurable part

DoAlgoStep5();

}

virtual public void DoAlgoStep3()

{

Console.WriteLine("In Algorithm - DoAlgoStep3");

}

virtual public void DoAlgoStep5()

{

Console.WriteLine("In Algorithm - DoAlgoStep5");

}

}

class CustomAlgorithm : Algorithm

{

public override void DoAlgoStep3()

{

Console.WriteLine("In CustomAlgorithm - DoAlgoStep3");

}

public override void DoAlgoStep5()

{

Console.WriteLine("In CustomAlgorithm - DoAlgoStep5");

}

}

/// <summary>

/// Summary description for Client.

/// </summary>

public class Client

{

public static int Main(string[] args)

{

CustomAlgorithm c = new CustomAlgorithm();

c.DoAlgorithm();

return 0;

}

}

}

再来对比下上面对窗体类进行改动的代码和TemplateMethod的例子代码,这就是一个TemplateMethod模式了

有一种观点说在设计期使用设计模式常会导致过渡设计,目前的敏捷方法和重构都渐渐提倡代码演化和重构达到设计模式。

我也是在写完代码后才发现这已经是一个模式了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有