模板方法模式和策略模式的应用场景浅析


最近闲下来整理一下模板方法模式和策略模式的区别和应用场景

一、定义

模板方法模式:定义一个算法的骨架,将骨架中的特定步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重新定义该算法的某些特定步骤

再看策略模式:

策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换

对于熟悉这两个定义的人来说,一目了然(然而当初我学习设计模式的时候,真觉得自己没学过语文)。换一种表达就是,模板模式注重的是一个骨架,定义一套步骤,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
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值