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

news/2024/7/19 9:22:47 标签: 设计模式, 爬虫

索引

  • 意图
  • 结构
  • 参与者
  • 适用性
  • 效果
  • 相关模式
  • 实现
    • 实现方式(一):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 }

设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。


http://www.niftyadmin.cn/n/1220866.html

相关文章

java 文件的过滤 FileFilter

下面的例子中我们创建了一个FileFilter类,此类根据文件名的扩展名是否为.txt来筛选文件。创建FileFilter实例之后需要将此实例作为参数传给File的listFiles(fileFilter)方法,此方法会返回符合条件文件的数组,如下代码示例 import java.io.Fil…

H3C交换机SSH配置完全攻略

1.创建工程 2.启动命令行终端输入命令 <H3C> <H3C>sys <H3C>system-view System View: return to User View with CtrlZ. [H3C]public-key local create rsa //在用户用ssh登录交换机时&#xff0c;交换机对要登录的用户使用的密码对其进行身份验证&#xf…

文件上传~Uploadify上传控件

对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步机制,当大文件通过HTTP方式发送到服务端时,对于服务端站点的主线程影响比较大…

telnet远程管理时使用密码登入实验

所用到的工具 CiscoPacketTracer_v6.2.rar&#xff1a;https://www.lanzous.com/i9xkjyf 实验文件&#xff1a;https://www.lanzous.com/i9xkgoh 拓扑图 要求 telnet远程管理时使用密码登入实验 需求&#xff1a;根据拓扑的标识完成项目考核配置&#xff0c;使得通过PC0可以…

java中Comparator比较器的使用

java中Comparator的使用&#xff1a;对用户集合进行排序&#xff0c;先按照年龄大小排序&#xff0c;若年龄相等&#xff0c;则按照姓名排序标签&#xff1a; <无>publicint compare(User u1, User u2) {}此方法返回一个int类型的数据&#xff0c;但是此int的值只能是一下…

Monkeyrunner 使用方法

MonkeyRunner 使用Monkey的使用简洁有效&#xff0c;但是总是给人感觉功能不够强大。所以&#xff0c;接下来向大家介绍非常给力的工具MonkeyRunner。一、什么是MonkeyRunner monkeyrunner工具提供了一个API&#xff0c;使用此API写出的程序可以在Android代码之外控制Android…

JDBC之PreparedStatement的用法

jdbc(java database connectivity&#xff0c;java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳&#xff1a;2002-02-05 20:56 或者 02/05/02…

实验:端口聚合EtherChannel配置

1.实验目的 通过本实验&#xff0c;读者可以掌握如下技能&#xff1a; ①EtherChannel的工作原理&#xff1b; ②EtherChannel的配置。 2.实验拓扑 实验拓扑图如图下所示。 3.实验步骤 构成EnterChannel的端口必须具有相同的特性&#xff0c;如双工模式、速度和Trunking 的…