设置模式(2)——模板方法模式
来源:互联网 发布:软件我的手机 编辑:程序博客网 时间:2024/06/03 16:02
1.定义
模板方法模式定义:
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.代码
定义抽象模板类:
//抽象模板类public abstract class AbstractModel { //基本方法-由子类实现,并在模板方法中调用 protected abstract void doSomething(); //基本方法 protected abstract void doAnotherthing(); //模板方法(防止恶意操作,一般加上final,不允许复写) public final void templateMethod() { //模板方法里调用基本方法 this.doSomething(); this.doAnotherthing(); }}
两个模板子类:
//模板子类1public class TestModel1 extends AbstractModel { @Override protected void doSomething() { System.out.println("TestModel1 doSomething"); } @Override protected void doAnotherthing() { System.out.println("TestModel1 doAnotherthing"); }}
//模板子类2public class TestModel2 extends AbstractModel { @Override protected void doSomething() { System.out.println("TestModel2 doSomething"); } @Override protected void doAnotherthing() { System.out.println("TestModel2 doAnotherthing"); }}
场景测试:
public static void main(String[] args) { //创建两个子类 TestModel1 model1 = new TestModel1(); TestModel2 model2 = new TestModel2(); //直接调用模板方法 model1.templateMethod(); model2.templateMethod();}
结果:
TestModel1 doSomethingTestModel1 doAnotherthingTestModel2 doSomethingTestModel2 doAnotherthing
3.模板方法模式的优缺点
优点:封装了不变的部分,可变部分子类继承可易于扩展。
缺点:
4.模板方法模式的扩展
添加钩子函数(其实即使控制语句)
抽象模板类:
//抽象模板类public abstract class AbstractModel { //添加控制方法的字段 private boolean isDoAnother = true; //基本方法-由子类实现,并在模板方法中调用 protected abstract void doSomething(); //基本方法 protected abstract void doAnotherthing(); //模板方法(防止恶意操作,一般加上final,不允许复写) public final void templateMethod() { //模板方法里调用基本方法 this.doSomething(); //通过子类设置的属性字段控制 if (this.isDoAnother) this.doAnotherthing(); } //钩子函数来约束子类是否需要执行某个方法 protected void setDoAnother(boolean doAnother) { isDoAnother = doAnother; }}
测试类:
public static void main(String[] args) { //创建两个子类 TestModel1 model1 = new TestModel1(); TestModel2 model2 = new TestModel2(); //直接调用模板方法 model1.setDoAnother(false); model1.templateMethod(); model2.templateMethod();}
结果:
TestModel1 doSomethingTestModel2 doSomethingTestModel2 doAnotherthing
阅读全文
0 0
- 设置模式(2)——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 【设计模式】——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式——模板方法模式
- 设计模式—模板方法模式
- hdu 2087 hash(板子
- PostgreSQL事务可以包含DML、DDL、DCL.md
- MySQL ('root'@'%') does not exist的问题
- 时间戳转化为日期格式
- C++数据类型总结
- 设置模式(2)——模板方法模式
- python之datetime
- vim精讲
- use strict 的用法
- java通过itext生成PDF,设置单元格cell的最大高度 以及 itext7初尝
- git 初始化操作
- Java并发编程:Lock
- 递归的理解
- OpenCV之通道和位深的理解(CV_8UC1,CV_8SC1,CV_32FC1)