设计模式之模版方法模式
2016-08-01 22:05
363 查看
转载至 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 模版方法模式的优点和缺点
优点:
* 模版方法模式通过把不变的行为搬移到超类,去除了子类中重复的代码。
* 把细节留给子类实现,有利于算法扩展。
缺点:
* 每个不同的实现都要定义一个新的子类。
相关文章推荐
- .NET设计模式-模版方法(Template Method)
- 设计模式--模版方法
- 23种设计模式(6):模版方法模式
- 模版方法设计模式
- 23种设计模式(6):模版方法模式
- .NET设计模式(16):模版方法(Template Method)
- 设计模式--模版方法模式(Templet Method Pattern)
- 设计模式之模版方法模式
- .NET设计模式(16):模版方法(Template Method)
- 23种设计模式(6):模版方法模式
- 设计模式--模版方法(TemplateMethod)
- 设计模式学习总结11 - 行为型6 - TemplateMethod模版方法模式
- 设计模式之模版方法模式
- java设计模式八--Template Method(方法模版模式)
- 设计模式与泡mm的关系之template method模版方法模式及再思考
- 设计模式--模版方法(TemplateMethod)
- [OOAD]设计模式之模版方法(Template Method)模式
- 设计模式(三)之模版方法模式(Template method Pattern)
- 设计模式之模版方法模试
- 23种设计模式(6):模版方法模式