设计模式之模版方法模式
来源:互联网 发布:大华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 模版方法模式的优点和缺点
优点:
* 模版方法模式通过把不变的行为搬移到超类,去除了子类中重复的代码。
* 把细节留给子类实现,有利于算法扩展。
缺点:
* 每个不同的实现都要定义一个新的子类。
- 设计模式之模版方法
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 大话设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- Android设计模式之模版方法模式
- 设计模式学习之模版方法模式
- 设计模式学习之模版方法模式
- 设计模式学习之模版方法模式
- 设计模式之模版方法模式
- Java设计模式之模版方法模式
- 模版方法设计模式
- hdoj 5773 The All-purpose Zero
- 贪心算法
- import static和import的区别
- 瑞士轮
- 11个审查Linux是否被入侵的方法
- 设计模式之模版方法模式
- Single Number
- 有return的情况下try catch finally的执行顺序
- Android5.1.1-APK签名校验分析和修改源码绕过签名校验
- Linux内核CPU负载均衡机制
- PC网站扫一扫获取微信授权用户注册
- 内部类
- JS中substr和substring的用法和区别
- 判断控件的状态是显示(SW_SHOW)还是隐藏(SW_HIDE)