2.设计模式--模板方法模式(TemplateMethod模式)

1.场景

模板方法模式,听名字就知道这个肯定和模板有关系,有这样一个逻辑,厨师炒菜,炒菜都是先打火,然后放油、放盐、翻炒、起锅、关火无论是我们炒土豆还是青菜,实际上都是按照这个模板来,步骤都是那么几步,都是按照顺序来的。

图片

2.模板方式结构图

图片

3.实现模板方法模式

TemplateMethod就是炒菜的模板,定义了抽象方法。其中具体的实现是交给子类去做的。TemplateMethod负责模板,就像炒菜模板只给了步骤,具体放多少油、放多少菜、翻炒多少下应该是子类去决定。cooking方法定义了模板的执行顺序,同时由于点火和起锅在炒菜这个例子中是都需要的,所以可以直接在模板中进行实现。

图片

Potato表示土豆丝的做法,其中定义了具体放多少调料和多少油以及具体的翻炒次数。

图片

Vegetables表示蔬菜的做法,其中定义了具体放多少调料和多少油以及具体的翻炒次数

图片

测试输出结果,可以看到炒土豆和蔬菜虽然共用了一个模板,但是实际上做出来的确实2种不同的菜。模板方法在做实现的时候,需要关注模板类具体的执行步骤,如果我们不使用模板方法,一旦顺序改变比如最后是先关火再起锅的话,这种情况所有关于做菜的类全部都需要进行更改。模板方法适用于步骤有一定顺序的业务,例如连接池、线程池、都是先去拿链接然后使用做具体的事情,最后干完了放回去。

图片

图片

4.JDK中的模板方法模式

在AQS中就使用了模板方法。其中tryAcquire方法是需要在子类中进行具体实现的,而acquire则定义了执行的顺序。

图片

模板方法模式的优缺点如下

优点:

1.可以提取公共的代码(点火、起锅)这种公共的都是通过父类来定义而子类只需要继承。

2.同时扩展性强,需要整个更改流程的时候只需要更改模板,同时父类只需要定义顺序,子类来实现具体的内容。

缺点:

1.子类在做继承的时候必须要注意父类的具体顺序

2.如果模板中需要插入新的步骤,此时所有子类都需要进行实现(即使某些子类并不需要)

参考文献:《图解设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值