您的位置:首页 > 编程语言 > Java开发

23种java设计模式之模板模式

2016-08-01 15:13 253 查看
说实话,我们学的框架其实就是模板,是不是这样引出话题就能很快理解模板模式呢,好了,下面我们用一个经典的泡咖啡,泡茶案例来说明模板模式。

泡咖啡步骤:水烧开--->冲泡咖啡粉--->把咖啡倒入杯子--->加糖和牛奶

泡茶步骤:水烧开--->冲泡茶叶--->把茶水导入杯子--->加柠檬

对于传统方法来思考,给一个HotDrinkHook超类,然后给出每个步骤的抽象类,让子类Coffee和Tea去完成,但是,有没有考虑到这泡咖啡和泡茶两者是否有共同点呢?比如第一个步骤和第三个步骤,完全一样嘛,所以,我们可以用模板模式来解决这个问题。

我们先给出分析类图:



给出超类HotDrinkHook:

public abstract class HotDrinkHook {

public final void Prepare(){

//烧水

BoilWater();

//泡(茶、咖啡)

Brew();

//倒进杯子

PutInCup();

//加配料

if(wantAddCondiments()){

AddCondiments();

}else{

System.out.println("不用了,谢谢!!!");

}

}

public boolean wantAddCondiments() {

//默认为需要添加

return true;

}

public abstract void AddCondiments();

private void PutInCup() {

System.out.println("把做好的倒入杯子!!!");

}

public abstract void Brew();

private final void BoilWater() {

System.out.println("把水烧开!!!");

}

}

对于那两个相同的方法我们用final来修饰,保证后面的子类也是按照这个方法,然后对于不同的方法我们用抽象方法写出,让子类自己去实现,这里我们还给出了第四步,让顾客自己选择是否加配料

CoffeeHook 子类:

public class CoffeeHook extends HotDrinkHook {

public void AddCondiments() {

System.out.println("加入咖啡!!!");

}

public void Brew() {

System.out.println("泡咖啡!!!");

}

public boolean wantAddCondiments() {

System.out.println("您是否要添加调味品(y/n):");

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String str="";

try {

str=br.readLine();

} catch (IOException e) {

e.printStackTrace();

}

if(str.equals("n")){

return false;

}

return true;

}

}

对于TeaHook就是两个方法不同,别的和CoffeeHook一样:

public void AddCondiments() {

System.out.println("加入柠檬!!!");

}

public void Brew() {

System.out.println("泡茶!!!");

}

最后测试Test:

public class Test {

public static void main(String[] args){

TeaHook teaHook=new TeaHook();

CoffeeHook coffeeHook=new CoffeeHook();

teaHook.Prepare();

coffeeHook.Prepare();

}

}

这样就可以满足条件了。

总结:

模板模式:模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现

通俗讲模板模式是这个算法或者说这个步骤是final的,不变的,保证了后面的子类也是按照这个算法做的,然后子类里面只要关系抽象函数的实现,不用关系步骤什么的,所以子类里面关心的东西就少多了,同时它把东西放在超类后,整个体系要改的话,只要在超类里改就行了,所以一定程度上对于维护,拓展,集中管理,更好维护。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息