如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/52089598
1 什么是模版方法模式
模版方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。
2 如何实现模版方法模式
我们以一个简单的问题入手。
* 写代码累的时候,总想喝点什么,可能咖啡、可乐、凉茶、白开水
* 但细心的你会发现,无论喝什么,都有一套相似的行为,不同的是状态,也就是具体的属性
* 大致都有取材料、处理材料、倒入杯子、喝等过程
* 现在需要你来为此定义一套模板方法
这个问题很明显需要采用模版方法。喝饮料大致可分为4个步骤:获取饮料、处理饮料、倒饮料、喝饮料。
首先我们定义抽象的模版方法。
package com.ittianyu.template;
public abstract class Drink {
public void drink() {
this.getDrink();
this.dealDrink();
this.pour();
this.beginDrink();
}
protected abstract void getDrink();
protected abstract void dealDrink();
protected abstract void pour();
protected abstract void beginDrink();
}
这个抽象类中,有一个已实现的方法,就是drink,这个方法调用了抽象的方法,也就是喝饮料的一系列过程。具体这个过程是什么样的,留给子类实现。
有了抽象父类,我们开始定义具体的子类。
package com.ittianyu.template;
public class Coffee extends Drink {
@Override
protected void getDrink() {
System.out.println("从箱子中拿出一包咖啡");
}
@Override
protected void dealDrink() {
System.out.println("把咖啡倒入壶中,用开水冲泡5分钟");
}
@Override
protected void pour() {
System.out.println("将泡好的咖啡倒入杯中");
}
@Override
protected void beginDrink() {
System.out.println("品尝一口香醇的咖啡\n");
}
}
package com.ittianyu.template;
public class Coke extends Drink {
@Override
protected void getDrink() {
System.out.println("从冰箱里拿出一罐可乐");
}
@Override
protected void dealDrink() {
System.out.println("拧开瓶盖");
}
@Override
protected void pour() {
}
@Override
protected void beginDrink() {
System.out.println("畅饮一瓶冰镇可乐\n");
}
}
package com.ittianyu.template;
public class Tea extends Drink {
@Override
protected void getDrink() {
System.out.println("从罐中取出几克上好的铁观音");
}
@Override
protected void dealDrink() {
System.out.println("把茶叶倒入紫砂壶中,用开水冲泡10分钟");
}
@Override
protected void pour() {
System.out.println("将泡好的茶倒入杯中");
}
@Override
protected void beginDrink() {
System.out.println("细细的品尝一口\n");
}
}
package com.ittianyu.template;
public class Water extends Drink {
@Override
protected void getDrink() {
System.out.println("从冰箱中拿出一瓶矿泉水");
}
@Override
protected void dealDrink() {
System.out.println("拧开瓶盖");
}
@Override
protected void pour() {
}
@Override
protected void beginDrink() {
System.out.println("大口的喝水\n");
}
}
最后是测试类。
package com.ittianyu.template;
public class Test {
public static void main(String[] args) {
Drink drink = new Coffee();
drink.drink();
drink = new Tea();
drink.drink();
drink = new Coke();
drink.drink();
drink = new Water();
drink.drink();
}
}
测试结果是:
从箱子中拿出一包咖啡
把咖啡倒入壶中,用开水冲泡5分钟
将泡好的咖啡倒入杯中
品尝一口香醇的咖啡
从罐中取出几克上好的铁观音
把茶叶倒入紫砂壶中,用开水冲泡10分钟
将泡好的茶倒入杯中
细细的品尝一口
从冰箱里拿出一罐可乐
拧开瓶盖
畅饮一瓶冰镇可乐
从冰箱中拿出一瓶矿泉水
拧开瓶盖
大口的喝水
3 在什么情况下使用模版方法模式
* 某些方法有大量的重复的实现。
* 控制子类扩展,让子类遵守规则。
4 模版方法模式的优点和缺点
优点:
* 模版方法模式通过把不变的行为搬移到超类,去除了子类中重复的代码。
* 把细节留给子类实现,有利于算法扩展。
缺点:
* 每个不同的实现都要定义一个新的子类。