设计模式-创建型模式-模板方法
设计模式-创建型模式-模板方法
定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤。
protected 对于本包及其子类可见。
类图
代码
代码如下
public abstract class AbstractClass{// 基本方法protected abstract void doSomething(); // 对于本包及其子类可见protected abstract void doAngthing();public void templateMethod(){this.doAngthing();this.doSomething();}
}
public class ConcreteClass1 extends AbstractClass {// 基本方法protected void doAnything(){}protected void doSomething(){}
}
public class ConcreteClass2 extends AbstractClass {// 基本方法protected void doAnything(){}protected void doSomething(){}
}
最后场景类完成调用。
public class Client{ConcreteClass1 class1 = ConcreteClass1();ConcreteClass1 class2 = ConcreteClass1();// 调用模板方法class1.templateMethod();class2.templateMethod();
}
扩展
public abstract class HummerModel{// 能发动protected abstract void start();// 能停下来protected abstract void stop();// 会发出声响protected abstract void alarm();// 引擎会响protected abstract void engineBoom();// 模型会跑public final void run(){// 发动汽车this.start();// 引擎轰鸣this.engineBoom();// 根据钩子,判断是否叫if (this.isAlarm()){this.alarm();}// 停车this.stop();}// 钩子protected boolean isAlarm(){return true;}
}
然后扩展HummerH1Model
public class HummerH1Model extends HummerModel{private boolean alamFlag = true; // 默认会响protected void alarm(){}protected void engineBoom(){}protected void start(){}protected void stop(){}protected boolean isAlarm(){return this.alarmFlag;}// 要不要响喇叭,由客户决定public void setAlarm(boolean isAlarm){this.alarmFlag = isAlarm;}
}
public class HummerH2Model extends HummerModel{private boolean alamFlag = true; // 默认会响protected void alarm(){}protected void engineBoom(){}protected void start(){}protected void stop(){}protected boolean isAlarm(){return this.alarmFlag;}// 要不要响喇叭,由客户决定public void setAlarm(boolean isAlarm){this.alarmFlag = isAlarm;}
}
最后定义场景
public class Client{public static void main(String[] args){// 生成一个HummerH1ModelHummerH1Model h1 = new HummerH1Model();// 然后设置喇叭h1.setAlarm(false);// 启动h1.run();// 模型2HummerH2Model h2 = new HummerH2Model();h2.run();}
}
总结
上方使用了一个钩子方法,即Hook Method 由一个钩子,控制了整个的运行,灰常方便。
关于父类调用子类,不建议这样做,使用如下做
把子类传递到父类的有参的构造函数中,然后调用
使用反射调用
父类调用子类的静态方法。
总结:父类建立框架,子类重写父类的部分方法,再调用从父类继承而来的结果,此为模板方法。
或者,当提供提供抽象类,并有一堆子类,需要扩展的时候,继承抽象类,覆写protected方法,然后调用execute方法,完成扩展。即可。
ts
ts没有多少类似的,故不再阐述。
设计模式-创建型模式-模板方法相关推荐
- 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)
七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- 设计模式-创建型模式-建造者模式
设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟)
设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...
- 设计模式-创建型模式-抽象工厂模式
工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...
- 设计模式-创建型模式-简单工厂模式
工程地址:设计模式-简单工厂源码-C++文档类资源-CSDN下载C++设计模式-创建型模式-简单工厂模式源码更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.n ...
- 设计模式-创建型模式-工厂方法模式
工程源码:c++设计模式-创建型模式-工厂方法模式https://download.csdn.net/download/qq_40788199/85541617 码云:https://gitee.co ...
- 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。
设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...
- 设计模式---创建型模式
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
最新文章
- js、css分别实现元素水平垂直居中
- 数据类型介绍和表的创建
- 高通首次演示基于3GPP的5G新空口连接 有望成为全球标准
- 检测洛达芯片的软件_购买华强北洛达1562a的10条须知!!!快来看!!!
- 用 JSON和userData 更全面的模拟 localStorage
- [AndroidO] [RK3399] -- CH341驱动移植
- Wlan学习备忘(上)
- 前端对接钉钉的步骤以及代码
- 安全管理实务之四:口令管理(转)
- 解决安装PyMySQL一直停在Building wheels for collected package:cryptography, cffi, pycparser的问题...
- [Chatter] : 以形写神
- 摄影测量中的什么是光流场_摄影中的“停止”是什么?
- 人生没有白读的书,每一本都算数~
- 网络版AIS接收机SLR350N
- 解决TraceCompass网站打不开和Stackoverflow显示不全的问题
- JWT认证方式之-System.IdentityModel.Tokens.Jwt
- OIM实现OIM用户修改、OIM用户Disable流程审批
- Linux UDP相关
- 与江南姑娘一起采茶去
- Worldwind配置文档