模板方法

标签: 模板方法 | 发表时间:2012-12-02 11:59 | 作者:haox
出处:http://www.cnblogs.com/

由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧!

大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:

《钟点工》中宋丹丹问要把大象装冰箱,总共分几步?赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢?

答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上。

  这个小品名字可能没多少人还记得,但是这个故事我想看过的人都会记得吧。那么从软件设计的角度如何看上面的问题呢?其实管他是大象,小象任何东西,只要是向冰箱里面放,最后抽象出来就三步而已,就是答案给出的三步第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上。是不是呢?

用代码看是不是这样,任何东西Anything都会有这三步

public abstract class Anything
{
/// <summary>
///第一步 打开冰箱
/// </summary>
protected abstract void OPenFridge();

/// <summary>
/// 第二步 大象放进冰箱
/// </summary>
protected abstract void PutIntoFridge();

/// <summary>
/// 第三步 关上冰箱
/// </summary>
protected abstract void CloseFridge();
}

  抽象类Anything类现在是只有三个抽象的方法对应上面的三步,接下来是不是还少一个总的对外方法,来封装现有的这三步呢?

public abstract class Anything
{

protected Anything()
{
}

/// <summary>
/// 装进冰箱
/// </summary>
public void Put()
{
OPenFridge();
PutIntoFridge();
CloseFridge();
}

/// <summary>
///第一步 打开冰箱
/// </summary>
protected abstract void OPenFridge();

/// <summary>
/// 第二步 大象放进冰箱
/// </summary>
protected abstract void PutIntoFridge();

/// <summary>
/// 第三步 关上冰箱
/// </summary>
protected abstract void CloseFridge();
}

  可能已经注意到这里是把OPenFridge(),PutIntoFridge(), CloseFridge()三个方法都是protected 的抽象方法,原因是:

  1. protected· 对外是不开放的,只对子类可见。由于实际要把东西放进冰箱里,只要调用Put()方法,不可能调用OpenFridge()
  2. abstract 具体的实现要到具体的类中去实现。可能实际中这三个抽象方法,只有PutIntoFridge()是不相同的,打开冰箱与关上冰箱是相同的,那么就这可在Anything中实现,而且可以把这两个方法改为private,具体的对象只用实现PutIntoFridge()就可以了。

  好接下来我们看要把大象,鸡蛋放进冰箱李,大象,鸡蛋该怎么实现:

/// <summary>
/// 大象
/// </summary>
public class Elephant:Anything
{

protected override void OPenFridge()
{
Console.WriteLine("要放大象了,先打开冰箱门!");
}

protected override void PutIntoFridge()
{
Console.WriteLine("把大象大卸八块放进冰箱的冷藏室!");
}

protected override void CloseFridge()
{
Console.WriteLine("大象放进冰箱了,可以关上门了!");
}
}

  

/// <summary>
///鸡蛋
/// </summary>
public class Egg : Anything
{

protected override void OPenFridge()
{
Console.WriteLine("要放鸡蛋了,先打开冰箱门!");
}

protected override void PutIntoFridge()
{
Console.WriteLine("把鸡蛋放进冰箱的保鲜室!");
}

protected override void CloseFridge()
{
Console.WriteLine("鸡蛋放进冰箱了,可以关上门了!");
}
}

  最后再看看客户端怎么调用:

static void Main()
{
//鸡蛋
Anything egg=new Egg();

//大象
Anything elephant = new Elephant();

//鸡蛋放进冰箱
egg.Put();

//大象放进冰箱
elephant.Put();
}

  上面例子用到的就是模板方法 (Template Method)——定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  由于该模式的UML图相对比较简单,就省掉了,直接运用vs的反向工程工具导出类图看看吧!

  该模式常用在一些处理的步骤、流程或骨架固定不变——父类中定义实现,但是具体实现步骤不同——延迟至子类中实现。

   ps: 一般我们常知道的是子类可以调用父类的方法,在该模式中提供了一种父类调用子类的方法的方式。

本文链接

相关 [模板方法] 推荐:

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

Java回调与模板方法模式

- - ITeye博客
一.Java回调与模板方法模式 . 模板方法模式很常用,其目的是在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 在标准的模板方法模式实现中,主要是使用继承的方式,来让父类在运行期间可以调用到子类的方法. 其实在Java开发中,还有另外一个方法可以实现同样的功能,那就是Java回调技术,通过回调在接口中定义的方法,调用到具体的实现类中的 方法,其本质是利用Java的动态绑定技术,在这种实现中,可以不把实现类写成单独的类,而使用内部类或匿名内部类来实现回调方法.