大家平时估计经常见自行车,今天就拿咱们生活中的自行车来开刀来谈一下自行车中
的模板。
我们就先做一个基本的实现,能跑,能停,能响。如果不考虑扩展性的话,那么依照
经验最一般的类图来说如下:
非常简单的实现, 自行车有两个型号,H1和H2,按照这种模型,我只要给你红旗牌模
型,先写个抽象类,然后不同型号模型的实现类,通过简单的继承就可以实现
我们的生产了,好了,那我们就先从抽象类开始编写。
public abstract class HongQIModel
{
//首先,这个模型能够发动
public abstract void start();
//能发动,还能够停止
public abstract void stop();
//好屌啊,还可以响铃
public abstract void alarm();
//模型也应该会跑吧
public abstract void run();
}
在抽象类中,我们定义了红旗牌自行车都必须具有的特质,能够发动,停止,喇叭会
响,。但是每个型号的自行车实现是不同的,H1牌如下
public class H1:HongQIModel
{
//H1型号的自行车鸣笛
public override void alarm()
{
Console.WriteLine("H1鸣笛");
}
//启动
public override void start()
{
Console.WriteLine("H1启动");
}
//停止
public override void stop()
{
Console.WriteLine("H1停车");
}
public override void run()
{
//先启动
this.start();
//我在响响铃
this.alarm();
//好了,跑累了,停止吧
this.stop();
}
}
大家看run()方法,这是一个汇总的方法,一个模型生产出来了,总该检测下吧!
“实践是检验真理的唯一标准”,是骡子,是马出来溜溜,让它跑起来,通过run()方
法,把模型的所有功能都测试到了
在看H2模型代码
public class H2:HongQIModel
{
//H2型号的自行车鸣笛
public override void alarm()
{
Console.WriteLine("H2鸣笛");
}
//启动
public override void start()
{
Console.WriteLine("H2启动");
}
//停止
public override void stop()
{
Console.WriteLine("H2停车");
}
public override void run()
{
//先启动
this.start();
//我在响响铃
this.alarm();
//好了,跑累了,停止吧
this.stop();
}
}
好了,看到这里,我们或许发现了什么问题,两个实现类中的run()方法都相同,因
此这个方法应该出现在抽象类,不应该在实现类上,抽象是所有子类的共同封装.
【注意,在编码过程中,如果相同的代码出现过两次的话,就要对设计产生怀疑,分析为什么会这样】
好了,既然发现问题了,那么我们就修改,修改后的类图与上面的一致,只不过抽象
类的代码进行了修改,如下
public abstract class HongQIModel { //首先,这个模型能够发动 public abstract void start(); //能发动,还能够停止 public abstract void stop(); //好屌啊,还可以响铃 public abstract void alarm(); //模型也应该会跑吧 public void run() { //先启动 this.start(); //我在响响铃 this.alarm(); //好了,跑累了,停止吧 this.stop(); } }
在抽象红旗牌自行车上定义了run方法的规则,先启动,然后响铃,最后停止,那么它
的具体的两个实现类就不用再实现run方法了。我们来看客户端的代码
static void Main(string[] args)
{
HongQIModel H1 = new H1();
H1.run();
}
通过这样我们就定义了一个个自行车的模板,生产出没问题,并且可以运行起来判断
是不是有问题,这就是我们今天要说的模板方法
模板方法定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一
个算法的结构即可以重定义该算法的某些特定步骤
通用类图如下
其中AbstractClass叫做抽象模板,它的方法分
为两类
1.基本方法
就是一些基本的操作,由子类实现,并且在
模板中被调用
2.模板方法
就是一个框架,完成就基本方法的调度
下面是其基本的代码如下
抽象模板类
public abstract class AbstractClass
{
//基本方法
public abstract void doSomething();
public abstract void doAnything();
//模板方法
public void templateMethod()
{
//调用基本方法,完成相关的逻辑
this.doAnything();
this.doSomething();
}
}
具体模板类
//具体模板类
public class ConcreteClass1:AbstractClass
{
public override void doAnything()
{
}
public override void doSomething()
{
}
}
客户端代码
static void Main(string[] args)
{
AbstractClass class1 = new ConcreteClass1();
class1.templateMethod();
}
模板方法模式的应用
优点
封装不变部分,扩展可变部分
通过上面的例子我们可以看出来,把共同的run要实现的部分,统一封装到了抽象类
中,我们想一想如果要增加一个H3牌的自行车,是不是特别容易,只需要增加一个子
类,实现父类的基本方法就可以了。
行为由父类控制,子类实现
我们看run()方法是不是由父类控制的呢,我们也完全更改运行的顺序,比如我们
可以先响铃,在启动等
使用场景
多个子类有公有的方法,并且逻辑基本相同时
重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各
个类实现
原文:http://blog.csdn.net/luckyzhoustar/article/details/22177759