我看java设计模式之二————模板模式
首先先举个例子:
有一个咖啡店,来的人经常需要喝咖啡,而店员需要给这些人去冲咖啡。这个动作可以简单的分为这么几步,
1,取杯子
2,倒入咖啡
3,倒入水
4,搅拌。
这样的话一杯咖啡就冲好了。
用代码实现的话
class Waiter{
void getCoffee(){
getCup();
putCoffee();
putWater();
mix();
}
void getCup(){
}
void putCoffee(){
}
void putWater(){
}
void mix(){
}
}
但是有一天,这个店还需要一个能倒茶的服务员,老板就想,我总不能去又重新找一个专门倒茶的伙计吧,于是他就问我该怎么办,我说,这还不简单,顾客需要茶的时候他就把咖啡换成茶不久可以了,要是需要咖啡,就倒咖啡。
这样这个类会变成这样:
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):实现抽象类中的抽象方法,已完成完整的算法。
类图:
在以上的情况下,对模板方法进行总结:
模板方法模式把不变的移到超类,去除子类重复代码。
子类实现算法的某些细节,有助于算法的扩展。
通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
适用场景
在某些类的算法中,用了相同的方法,造成代码的重复。
控制子类扩展,子类必须遵守算法规则。