模板方法(Template Method)

 

模板方法(Template Method).

1.简介

       作为模板的方法要定义在父类,而方法的定义中使用到抽象方法。因此如果只看父类部分的程序,根本不知道到底会是怎样的处理内容,最多只能了解该如何调用抽象方法而已。

实际实现抽象方法的是子类,要在子类实现方法,才能决定具体的操作。理论上,如果在不同的子类执行了不同的实现,应该就能发展出不同的处理内容。不过,无论在子类执行任何一种实现,处理的大致流程都还是依照父类所制定的方式。

 

 

在上例中,处理的大致流程都还是依照父类所制定的display()方法决定的,子类只是实现其他抽象的方法(open(),print(),close())。。

具体代码:

  

这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。
  继承关系由于自身的缺陷,被专家们扣上了罪恶的帽子。使用委派关系代替继承关系尽量使用接口实现而不是抽象类继承等等专家警告,让我们这些菜鸟对继承另眼相看
  其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对你的系统设计起到很好的作用的。而模板方法模式就是其中的一个使用范例。

2、定义与结构
  GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。上例中的算法骨架就是display(),而特定的步骤就是(open(),print(),close()).

 

来看下这个简单模式的结构吧:

  1) AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。

  2) ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

  下面是模板方法模式的结构图。直接把《设计模式》上的图拿过来用下:

 

 

适用情况
  根据上面对定义的分析,以及例子的说明,可以看出模板方法适用于以下情况:
  1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

  2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。

  3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面display()方法就只在open()方法后面调用print(),print()方法后面调用close()。如果你不愿子类来修改你的模板方法(display())定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。

  可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。

3.扩展

       Template Method Pattern究竟有什么好处呢??

       因为父类的模板已经实现了算法,所以子类就不需要重新逐一实现算法。

       假设现在故意不用Template Method Pattern,建立ConcreteClass1, ConcreteClass2, ConcreteClass3等都是一些似是而非的类,刚写完还可以,当发现ConcreteClass1中有一个Bug的时候,怎么办呢??? 只修改一个Bug无法反映到所有的ConcreteClass参与者上。

       从这个角度来看,如果利用Template Method Pattern来写程序的话,当发现模板里面的错误时,就只要修改模板就行了。

4.相关的Pattern

1.Factory Method Pattern

       Template Method Pattern应用于产生对象实例的典型示例就是Factory Method Pattern.

2.Strategy Pattern

       Template Method Pattern可以利用“继承”来更改程序,先以父类规定程序类型的大纲,然后再用子类规定较具体的行为。

       相比之下,Strategy Pattern则可以利用“委托”来更改程序。不过,Stategy Pattern不是修改部分程序,而是切换整个算法。

5.进阶

一.父类对子类的要求

以前我们学习类层次时,总是从子类的角度来思考,我们会比较着重:

1.       在子类可利用父类中所定义的方法。

2.       子类只要写一点点方法就可以新增其他功能。

3.       在子类重载方法就能修改程序行为。

现在换个角度,从父类思考,父类定义了抽象的方法,则表示:

1.       期待子类会实现这个方法。

2.       要求子类实现这个方法。

 

二.抽象类的意义    

       “一个无法建立对象的类究竟扮演什么样的参与者”?????

学习了本课题后,应该有所了解了。实际的处理内容当然要等到执行子类才会确定,不过抽象类的阶段就先抓出处理流程的类型也很重要。

       至于应该在什么阶段把处理分开,哪些处理交给父类,哪些处理交给子类,好像并没有具体的规定,目前还没找到答案,属于自由发挥中。。。

      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值