设计模式实例学习-模板方法
来源:互联网 发布:人工智能出现表明 编辑:程序博客网 时间:2024/06/10 20:30
设计模式实例学习-模板方法
原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49954803
定义
概念定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 我的理解,先举个最简单例子,我们打开门的时候走的流程是这样的:解锁->开门。这里解锁和开门就是算法的框架,每个打开门的流程都是这样的,但具体如何解锁及如何开门则是子类负责的,比如解锁可能是密码解锁、钥匙解锁、指纹解锁等等,而开门可能是推开门、拉卡门、向上拉门等等。通过已知的模板流程,在不同子类去定义实现不同的具体细节方法。
角色职能
抽象模板类
像定义描述的那样,定义一个算法的模板,里面的一些方法交由子类具体实现。
具体模板类
实现模板中的具体细节方法。
实例分析
场景描述
老板打算简单实现一个网上购物的第三方软件,根据公众的认可度,买电子商品一般我会上京东,买书的话一般会上当当。支付的话,微信有时会有京东的优惠卷,所以在京东用微信支付,当当网就用支付宝付款。根据这个情况完成老板给的需求。
代码实现及讲解
- 抽象模板类
ShoppingOnline.java
//网上购物-抽象模板类public abstract class ShoppingOnline { //上指定的网站 public abstract void getWebsite(); //订购需要的商品 public abstract void getTheNeed(); //网上付钱 public abstract void pay(); //购物流程模板 public void shoppingProcedure(){ this.getWebsite(); this.getTheNeed(); this.pay(); }}
- 具体模板类
BuyBooks.java:具体实现模板方法中的具体细节。
BuyComputers.java:具体实现模板方法中的具体细节。
//网上买书public class BuyBooks extends ShoppingOnline{ @Override public void getWebsite() { System.out.println("当当网"); } @Override public void getTheNeed() { System.out.println("Java编程思想、java虚拟机..."); } @Override public void pay() { System.out.println("支付宝付款"); }}
//买电脑产品public class BuyComputers extends ShoppingOnline{ @Override public void getWebsite() { System.out.println("京东商城"); } @Override public void getTheNeed() { System.out.println("联想笔记本、机械键盘..."); } @Override public void pay() { System.out.println("微信支付"); }}
- 场景类
public class Main { public static void main(String[] args) { ShoppingOnline buyBooks = new BuyBooks(); ShoppingOnline buyCompu = new BuyComputers(); buyBooks.shoppingProcedure(); System.out.println("--------------------"); buyCompu.shoppingProcedure(); }}
输出:
当当网Java编程思想、java虚拟机...支付宝付款--------------------京东商城联想笔记本、机械键盘...微信支付
这样看过去大部分人都觉得DEMO很简答,而且自己以前也经常有这样写过这样类似的东西,但事实上者这就是模板方法。父类中定义了算法框架流程,子类实现区别性的细节部分。
模板方法的优缺点
优点
- 提取出了公共部分的代码,便于维护。
- 在抽象类中对算法流程进行封装,在子类中实现及拓展。
缺点
- 子类中实现具体方法细节,子类的执行结果影响父类,代码可读性降低。(事实上我觉得这样不太算缺点,相比于优点,这个缺点可以忽略不计吧。)
使用场景
- 框架流程相同时(多个子类拥有共同的方法)
- 核心、复杂的方法设计为模板方法,子功能由子类去实现。
- 重构时常常将相同的代码抽取到父类中常常用到模板方法,通过钩子函数约束行为(isXXX、setXXX)。
1 0
- 设计模式实例学习-模板方法
- 设计模式实例-模板方法模式
- Java设计模式模板方法实例
- 设计模式学习----模板方法模式
- 设计模式入门学习 模板方法模式
- 设计模式学习-----模板方法模式
- 设计模式学习笔记-模板方法模式
- 设计模式学习--模板方法模式
- 设计模式学习--模板方法模式
- 设计模式学习二、模板方法模式
- 23种设计模式C++实例之模板方法模式
- 设计模式学习-Template Method(模板方法)
- 模板方法设计模式--学习笔记
- JAVA学习--模板方法设计模式
- 设计模式---模板模式 实例
- 设计模式学习之---模板方法设计模式
- 设计模式的学习之路--模板方法设计模式
- 设计模式实例学习-工厂方法
- 编码
- 杭电ACM1003,1004,1005 java解答
- 【bzoj3123】 [Sdoi2013]森林
- 恶梦射手学习笔记
- 如何使用XML作为小型数据库
- 设计模式实例学习-模板方法
- [IOS经验总结]UIWebView与JS之间的数据交互
- css解决IE、Firefox兼容的div高度100%的问题
- Qt---实现在QLineEdit中输入密码时先显示明文,然后显示*号
- Javase基础部分笔记之IO(一)
- 抓取前端渲染的页面的技术webmagic
- IOS中将字典转成模型对象
- flv、MP4 视频播放问题
- MySQL 主从复制的原理和配置