设计模式之美:Template Method(模板方法)-阿里云开发者社区

开发者社区> 嗯哼9925> 正文

设计模式之美:Template Method(模板方法)

简介:
+关注继续查看

索引

意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

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.

结构

参与者

AbstractClass

  • 定义抽象的原语操作(Primitive Operation),具体的子类将重定义它们以实现一个算法的各步骤。
  • 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在类中的其他操作。

ConcreteClass

  • 实现原语操作以完成算法中与特定子类相关的步骤。

适用性

在以下情况下可以使用 Template Method 模式:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 控制子类扩展。只允许特定的点进行扩展。

效果

  • 模板方法是一种代码复用的基本技术。
  • “好莱坞法则:Don't call us, we'll call you.”,一个父类调用一个子类的操作,而不是相反。

相关模式

  • Factory Method 常被 Template Method 调用。
  • Template Method 使用继承来改变算法的一部分。Strategy 使用委托来改变整个算法。

实现

Template Method 可调用下列类型的操作:

  • 对客户的操作
  • 具体的 AbstractClass 中的操作
  • Factory Method 方法
  • 抽象操作(Primitive Operation)(must be overridden)
  • 钩子操作(Hook Operation)(may be overridden),通常提供默认实现。

Template Method 需要指明哪些是 Hook Operation,哪些是 Primitive Operation。例如使用命名约定等方式指明。

实现方式(一):Template Method 模式结构样式代码。

定义 Template Method 的一个重要的目的是尽量减少一个子类具体实现该算法时必须重定义的那些原语操作的数目。

需要重定义的操作越多,客户程序就越冗长。

复制代码
 1 namespace TemplateMethodPattern.Implementation1
 2 {
 3   public abstract class Algorithm
 4   {
 5     public void TemplateMethod()
 6     {
 7       Step1CanNotBeCustomized();
 8       Step2();
 9       Step3WithDefault();
10     }
11 
12     private void Step1CanNotBeCustomized()
13     {
14       Console.WriteLine("Step1");
15     }
16 
17     protected abstract void Step2();
18 
19     protected virtual void Step3WithDefault()
20     {
21       Console.WriteLine("Default Step3");
22     }
23   }
24 
25   public class ConcreteAlgorithmA : Algorithm
26   {
27     protected override void Step2()
28     {
29       Console.WriteLine("ConcreteAlgorithmA.Step2");
30     }
31   }
32 
33   public class ConcreteAlgorithmB : Algorithm
34   {
35     protected override void Step2()
36     {
37       Console.WriteLine("ConcreteAlgorithmB.Step2");
38     }
39 
40     protected override void Step3WithDefault()
41     {
42       Console.WriteLine("ConcreteAlgorithmB.Step3");
43     }
44   }
45 
46   public class Program
47   {
48     public void TestCase1()
49     {
50       var algorithm1 = new ConcreteAlgorithmA();
51       algorithm1.TemplateMethod();
52 
53       var algorithm2 = new ConcreteAlgorithmB();
54       algorithm2.TemplateMethod();
55     }
56   }
57 }
复制代码







版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
22、Python与设计模式--状态模式
#一、电梯控制器 电梯在我们周边随处可见,电梯的控制逻辑中心是由电梯控制器实现的。电梯的控制逻辑,即使简单点设计,把状态分成开门状态,停止状态和运行状态,操作分成开门、关门、运行、停止,那流程也是很复杂的。首先,开门状态不能开门、运行、停止;停止状态不能关门,停止;运行状态不能开门、关门、运行。要用一个一个if…else…实现,首先代码混乱,不易维护;二是不易扩展。至于各种设计原则什么的……
3946 0
C++ 模板中的template typename 和template class的区别
    本文翻译自:点击打开链接     在大多数情况下,template<typename T> 与template<class T>是可以相互通用的,而且在早期的C++ 版本中也只有template<class T>一种申明方式。     但是这种重复利用已存在的关键字的方式似乎会引起混淆。比如下面这样一个例子:      template &
1377 0
23、Python与设计模式--设计原则
#一、六大设计原则 在法理学中,法律规则与法律原则都是法律规范的重要构成。但二者也会有些不同:法律规则是指采取一定的结构形式具体规定人们的法律权利、法律义务以及相应的法律后果的行为规范,内容比较明确,比如,交通法规中规定,禁止闯红灯;法律原则是指在一定法律体系中作为法律规则的指导思想,基本或本原的、综合的、稳定的原理和准则,内容上只包含“大方针”,而并未有具体规则,比如,如果车上有马上临产的孕妇
3138 0
模板(templates)
通常情况下,我们不会像hello world一样直接在视图函数中编写返回内容,而是专门返回一个渲染过的模板。Flask使用Jinja2完成这一任务。 1.
514 0
+关注
4716
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载