设计模式之模版方法模式

来源:互联网 发布:大华7016软件 编辑:程序博客网 时间:2024/05/01 18:56

如有转载,请申明:

转载至 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 {@Overrideprotected void getDrink() {System.out.println("从箱子中拿出一包咖啡");}@Overrideprotected void dealDrink() {System.out.println("把咖啡倒入壶中,用开水冲泡5分钟");}@Overrideprotected void pour() {System.out.println("将泡好的咖啡倒入杯中");}@Overrideprotected void beginDrink() {System.out.println("品尝一口香醇的咖啡\n");}}


package com.ittianyu.template;public class Coke extends Drink {@Overrideprotected void getDrink() {System.out.println("从冰箱里拿出一罐可乐");}@Overrideprotected void dealDrink() {System.out.println("拧开瓶盖");}@Overrideprotected void pour() {}@Overrideprotected void beginDrink() {System.out.println("畅饮一瓶冰镇可乐\n");}}


package com.ittianyu.template;public class Tea extends Drink {@Overrideprotected void getDrink() {System.out.println("从罐中取出几克上好的铁观音");}@Overrideprotected void dealDrink() {System.out.println("把茶叶倒入紫砂壶中,用开水冲泡10分钟");}@Overrideprotected void pour() {System.out.println("将泡好的茶倒入杯中");}@Overrideprotected void beginDrink() {System.out.println("细细的品尝一口\n");}}


 

package com.ittianyu.template;public class Water extends Drink {@Overrideprotected void getDrink() {System.out.println("从冰箱中拿出一瓶矿泉水");}@Overrideprotected void dealDrink() {System.out.println("拧开瓶盖");}@Overrideprotected void pour() {}@Overrideprotected 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 模版方法模式的优点和缺点

 

优点:

 * 模版方法模式通过把不变的行为搬移到超类,去除了子类中重复的代码。

 * 把细节留给子类实现,有利于算法扩展。

 

 

缺点:

 * 每个不同的实现都要定义一个新的子类。

1 0