设计模式-templete method
程序员文章站
2022-07-06 11:46:36
...
模板方法模式:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法的实现需要语言层面的支持:比如继承,多态。
关注点:
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
模式中的角色:
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。
注意点:
一般把模板方法定义成final避免被子类修改
JDK中的体现:
ThreadPoolExecutor.Worker
举例:
角色:抽象模板
具体子类:
客户端:
输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法的实现需要语言层面的支持:比如继承,多态。
关注点:
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
模式中的角色:
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。
注意点:
一般把模板方法定义成final避免被子类修改
JDK中的体现:
ThreadPoolExecutor.Worker
举例:
角色:抽象模板
package com.pichen.dp.behavioralpattern.templatemethod; public abstract class Day { public void getUp(){ System.out.println("get up~"); } public abstract void breakfast(); public abstract void goToWork(); public abstract void working(); public abstract void lunch(); public abstract void goHome(); public abstract void supper(); public void sleep(){ System.out.println("sleep~"); } //模板方法 public final void process(){ getUp(); breakfast(); goToWork(); working(); lunch(); working(); goHome(); supper(); sleep(); } }
具体子类:
public class ProgrammerDay extends Day{ /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast() */ @Override public void breakfast() { System.out.println("breakfast:noodle~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork() */ @Override public void goToWork() { System.out.println("goToWork:drive car~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#working() */ @Override public void working() { System.out.println("working: coding~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch() */ @Override public void lunch() { System.out.println("lunch: eat rice~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome() */ @Override public void goHome() { System.out.println("goHome: walk~"); } /** * @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper() */ @Override public void supper() { System.out.println("supper: rice~"); } }
客户端:
public class Main { public static void main(String[] args) { Day programmerDay = new ProgrammerDay(); programmerDay.process(); } }
输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~
上一篇: TF之DNN:TF利用简单7个神经元的三层全连接神经网络实现降低损失到0.000以下(输入、隐藏、输出层分别为 2、3 、 2 个神经元)——Jason niu
下一篇: 设计模式-Immutable
推荐阅读
-
JavaScript设计模式精华摘抄(持续更新...)-考拉阅读前端团队-SegmentFault思否
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
js 设计模式——状态模式
-
Java设计中的Builder模式的介绍
-
c#设计模式之单例模式的实现方式
-
23种GoF设计模式概述
-
React组件设计模式之组合组件应用实例分析
-
Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring
-
设计模式之单例模式(懒汉式单例、饿汉式单例、登记式单例)
-
Spring,SpringMvc,MyBatis用到的设计模式