最近闲下来整理一下模板方法模式和策略模式的区别和应用场景
一、定义
模板方法模式:定义一个算法的骨架,将骨架中的特定步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重新定义该算法的某些特定步骤
再看策略模式:
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
对于熟悉这两个定义的人来说,一目了然(然而当初我学习设计模式的时候,真觉得自己没学过语文)。换一种表达就是,模板模式注重的是一个骨架,定义一套步骤,1、2、3、4、5…,每个步骤做什么操作,可以被子类覆盖,但步骤的执行顺序不能改变;而策略模式注重的是操作本身,定义一个操作会在特定时刻调用,但具体的操作可以用子类实现。
应用场景可以看下面的例子,上“栗子”。
二、举个例子
前段时间跟同事讨论了一下鱼的做法,引出了代码实现,这次就举这个例子,权当需求。
1.杀鱼
杀一条鱼的顺序,杀鱼->去鱼鳞->清内脏,每一步具体操作都可能不一样,比如杀鱼可以用刀背、擀面杖等,鱼鳞可以用到刮、可以用手拔(我第一次杀鱼就是用手拔的鱼鳞<-_->),但是整体流程确实几乎不变的。
2.做鱼
一条鱼根据烹饪方式不同可以做出很多道菜,可以清蒸、红烧、炭烤等,每种烹饪方式的过程都不大相同。
三、伪代码实现
1.杀鱼
1.1分析
杀鱼的方式有很多,但却可以认为有一个固有流程,杀鱼->去鱼鳞->清内脏,每一个步骤都可以因方式的不同而被替换,但总体流程不变;通过上面的定义可以选择模板模式实现
1.2实现
- 定义模板类PrepareFishTemplate
/**
* 准备食材鱼
*/
public abstract class PrepareFishTemplate {
/**
* 清理鱼鳞
*/
public abstract void clearScales();
/**
* 清理内脏
*/
public abstract void clearViscera();
/**
* 杀鱼
*/
public abstract void kill();
public final void perpare() {
this.kill();
this.clearScales();
this.clearViscera();
}
}
- 每种杀鱼方式都需要定义单独类去继承模板类,并实现相应方法
- 常规方式CommonPrepareFish
/** * 常规处理鱼 */ public class CommonPrepareFish extends PrepareFishTemplate { @Override public void clearScales() { System.out.println("使用刀刮去鱼鳞..."); } @Override public void clearViscera() { System