我看java设计模式之二————模板模式java
首先先举个例子:算法
有一个咖啡店,来的人常常须要喝咖啡,而店员须要给这些人去冲咖啡。这个动做能够简单的分为这么几步,设计模式
1,取杯子ide
2,倒入咖啡设计
3,倒入水code
4,搅拌。get
这样的话一杯咖啡就冲好了。it
用代码实现的话模板
class Waiter{ void getCoffee(){ getCup(); putCoffee(); putWater(); mix(); } void getCup(){ } void putCoffee(){ } void putWater(){ } void mix(){ } }
可是有一天,这个店还须要一个能倒茶的服务员,老板就想,我总不能去又从新找一个专门倒茶的伙计吧,因而他就问我该怎么办,我说,这还不简单,顾客须要茶的时候他就把咖啡换成茶不久能够了,要是须要咖啡,就倒咖啡。class
这样这个类会变成这样:
abstract class Waiter{ void getUwant(){ getCup(); putSomeThing(); putWater(); mix(); } void getCup(){ } abstract void putSomeThing(); void putWater(){ } void mix(){ } }
而后,这个伙计会两样功夫,当须要咖啡的时候:
class CoffeeWaiter extends Waiter{ @Override void putSomeThing() { // TODO Auto-generated method stub System.out.println("我倒咖啡"); } } class TeaWaiter extends Waiter{ @Override void putSomeThing() { // TODO Auto-generated method stub System.out.println("我倒茶"); } }
这就是一个简单的模板模式的应用:
下面来看概念:
概述
定义一个操做中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义算法的某些特定步骤。
模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
类图:
在以上的状况下,对模板方法进行总结:
模板方法模式把不变的移到超类,去除子类重复代码。
子类实现算法的某些细节,有助于算法的扩展。
经过一个父类调用子类实现的操做,经过子类扩展增长新的行为,符合“开放-封闭原则”。
缺点
每一个不一样的实现都须要定义一个子类,这会致使类的个数的增长,设计更加抽象。
适用场景
在某些类的算法中,用了相同的方法,形成代码的重复。
控制子类扩展,子类必须遵照算法规则。