十四、模版方法设计模式
来源:互联网 发布:网络作家富豪榜2015年 编辑:程序博客网 时间:2024/05/16 12:49
1. 模版方法模式介绍
在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。
例如: 去食堂吃饭一般都有这样的步骤:
1. 排队
2. 买饭
3. 吃饭
这三个步骤一般都是固定的,但是不同的菜,三个步骤的具体操作是不确定的。
不同的菜买不同的原料;不同的菜不同的切法;不同的菜不同的做法。
但是这三个步骤一定是固定的。
2. 模版方法模式的使用场景
- 多个子类有公有的方法,并且逻辑基本相同。
- 重要、复杂的算法,可以把核心算法设计为模板算法,周边的相关细节功能由各个子类实现。
- 重构时,模版方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约定其行为。
3. 模版方法模式的UML类图
角色介绍:
AbsTemplate: 抽象类,定义了一套算法框架
ConcreteImplA:具体实现类A
ConcreteImplB:具体实现了B
4. 模版方法模式的简单实现
下面用代码模拟食堂买饭的情景:
- (1)、定义一个抽象模版:
在eatDinner方法里面依次顺序执行三个方法。
public abstract class EatDinner { protected void queue() { System.out.println("排队"); } protected void buy() { System.out.println("买饭"); } protected void eat() { System.out.println("吃饭"); } //市场吃饭的步骤 public final void eatDinner() { queue(); buy(); eat(); }}
- (2)、两个具体的实现类AEatDinner、BEatDinner:
public class AEatDinner extends EatDinner { @Override protected void queue() { System.out.println("排在A队"); } @Override protected void buy() { System.out.println("买双份"); } @Override protected void eat() { System.out.println("在食堂吃"); }}
BEatDinner:
public class BEatDinner extends EatDinner { @Override protected void queue() { System.out.println("排在B队"); } @Override protected void buy() { System.out.println("买一份"); } @Override protected void eat() { System.out.println("带宿舍吃饭"); }}
- (3)、测试类:
public class Client { public static void main(String[] args) { EatDinner aEatDinner= new AEatDinner(); EatDinner bEatDinner = new BEatDinner(); aEatDinner.eatDinner(); System.out.println("------"); bEatDinner.eatDinner(); }}
5. 模版方法模式在Android源码中
在Android源码中,模版设计模式比较常见,Activity的生命周期本身就是一个模版设计模式,这里就不具体分析了,相信大家在开始学习Android的时候,都已经对Activity的生命周期有所了解。
6. 模版方法模式在Android开发中:
这点就简单说一下,我们在onCreate方法中定义一下三个方法,自定义生命周期,用来进行相应的操作:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initVariables(); initView(); initData(); } //初始化变量 private void initVariables() { } //初始化View private void initView() { } //初始化数据 private void initData() { }}
7.总结
- 模版方法比较常见,其目的就是对流程进行封装。封装不可变的,扩展可变的。
0 0
- 十四、模版方法设计模式
- JAVA--模版方法模式(Template Method)--设计模式十四
- 设计模式(十四)------23种设计模式(6):模版方法模式
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 设计模式-模版方法
- 设计模式--模版方法模式
- 设计模式 - 模版方法模式
- 设计模式---模版方法模式
- 【设计模式】模版方法模式
- 设计模式 模版方法模式
- 设计模式--模版方法模式
- 设计模式---- 模版方法模式
- 设计模式-模版方法模式
- 设计模式 - 模版方法模式
- [剑指offer]整数中1出现的次数(从1到n整数中1出现的次数)
- HDU1010:Tempter of the Bone(DFS)
- CDMA订阅
- Android开发学习中的问题2016-5-03手动创建活动
- 常用算法整理:二叉树
- 十四、模版方法设计模式
- 网络地址为172.16.0.0,采用子网掩码255.255.224.0 .以下说法正确的是()
- LeetCode.342. Power of Four
- php面试总结
- 数据库基本概念
- LeetCode.343. Integer Break
- 【HUSTOJ】1021: 数字之积
- 为何一条短信可以发160个英文或70个汉字的原因
- css滤镜总结