23种设计模式之模板方法模式
来源:互联网 发布:2017美剧推荐 知乎 编辑:程序博客网 时间:2024/06/08 09:05
在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而变化的。
模板方法模式的定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方式的使用场景
a. 多个子类有公有的方法,并且逻辑基本相同时。
b. 多重、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
c. 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
模板方法模式的UML类图
角色介绍:
Abstemplate:抽象类,定义了一套算法框架
ConcreteImplA:具体实现类A
ConcreteImplB:具体实现类B
// <summary> // 抽象类 // </summary> public abstract class AbstractClass { //一些抽象行为,放到子类去实现 public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); // <summary> // 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。 // </summary> public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine("Done the method."); } } // <summary> // 具体类,实现了抽象类中的特定步骤 // </summary> public class ConcreteClassA : AbstractClass { // <summary> // 与ConcreteClassB中的实现逻辑不同 // </summary> public override void PrimitiveOperation1() { Console.WriteLine("Implement operation 1 in Concreate class A."); } // <summary> // 与ConcreteClassB中的实现逻辑不同 // </summary> public override void PrimitiveOperation2() { Console.WriteLine("Implement operation 2 in Concreate class A."); } } // <summary> // 具体类,实现了抽象类中的特定步骤 // </summary> public class ConcreteClassB : AbstractClass { // <summary> // 与ConcreteClassA中的实现逻辑不同 // </summary> public override void PrimitiveOperation1() { Console.WriteLine("Implement operation 1 in Concreate class B."); } // <summary> // 与ConcreteClassA中的实现逻辑不同 // </summary> public override void PrimitiveOperation2() { Console.WriteLine("Implement operation 2 in Concreate class B."); } }
客户端代码:
class Program { static void Main(string[] args) { // 声明抽象类 AbstractClass c; // 用ConcreteClassA实例化c c = new ConcreteClassA(); c.TemplateMethod(); // 用ConcreteClassB实例化c c = new ConcreteClassB(); c.TemplateMethod(); Console.Read(); } }
5. 模式总结
模板方法模式用4个字概括就是:流程封装。也就是把某个固定的流程封装到一个final函数中,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提供共用的代码,提升代码的复用率,同时也带来了更好的可扩展性。
优点
a. 封装不变的部分,扩展可变的部分
b. 提取公共的代码,便于维护。
缺点
模板方法会带来代码阅读的难度,会让用户觉得难以理解。
阅读全文
1 0
- 23种设计模式C++实例之模板方法模式
- 23种设计模式之模板方法模式
- 23种设计模式之模板方法模式
- 23种设计模式之——模板方法模式
- 23种设计模式-模板方法模式
- 设计模式之模板方法模式模板方法模式
- 23设计模式之模板方法(TemplateMethod)
- 23设计模式之模板方法(TemplateMethod)
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- mybatis-sql映射文件-CRUD-1
- [YTU]_2441( C++习题 复数类--重载运算符2+)
- C/C++中 size_t 与C#中类似的类型定义
- Math 和 Integer对数的操作方法和
- ajax返回值List转换为json格式数据
- 23种设计模式之模板方法模式
- netcdf数据nc格式数据java解析总结(二)使用java生成.nc格式文件
- Android 如何模拟返回键、菜单键、主页键?
- php入门学习-----接口
- java枚举
- Centos7软件的安装
- TCP三次握手与四次握手
- [YTU]_2443 ( C++习题 复数类--重载运算符3+)
- 二进制数中1的个数