大话设计模式——模板方法(TemplateMethod)
来源:互联网 发布:网游等级算法 编辑:程序博客网 时间:2024/06/10 06:46
宏观导图
细节展示
1、结构图
2、关键代码
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace TemplateMethod_Pattern{ class Program { static void Main(string[] args) { AbstracClass c; c = new ConcreteClasssA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); Console.Read(); } } //定义一个抽象类,注意此处不能为接口。因为里面可能有具体的方法实现 abstract class AbstracClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public virtual bool PrimitiveOperation3() // 定义一个钩子方法 { return true; } public void TemplateMethod() // 定义一个模板方法,确定算法的骨架。算法的执行顺序 { PrimitiveOperation1(); PrimitiveOperation2(); if (PrimitiveOperation3()) //如果钩子方法PrimitiveOperation3的返回值为true ,则执行输出 { Console.WriteLine("成功实现对父类的反向控制!"); } } } //具体策略类,继承抽象类。实现抽象方法,利用钩子函数对父类实现反向控制 class ConcreteClasssA : AbstracClass { public override void PrimitiveOperation1() { Console.WriteLine("具体策略A的1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体策略A的2实现"); } public override bool PrimitiveOperation3() { //return true; //执行父类的钩子方法PrimitiveOperation3 return false; //不执行父类中的钩子方法PrimitiveOperation3 } } class ConcreteClassB : AbstracClass { public override void PrimitiveOperation1() { Console.WriteLine("具体策略b的1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体策略b的2实现"); } public override bool PrimitiveOperation3() { //return true; //执行父类的钩子方法PrimitiveOperation3 return false; //不执行父类中的钩子方法PrimitiveOperation3 } }}</span>
3、基本概念理解
3.1模板方法:定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模板方法定义在抽象类中,并由子类不加以修改地完全继承下来。模板方法是一个具体方法,它给出了一个顶层逻辑框架,而逻辑的组成步骤在抽象类中可以是具体方法,也可以是抽象方法。由于模板方法是具体方法,因此模板方法模式中的抽象层只能是抽象类,而不是接口。
3.2基本方法:实现算法各个步骤的方法,是模板方法的组成部分。它分为三种,分别是:钩子方法,抽象方法,具体方法。
3.21钩子方法:由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现。钩子方法分两种,第一种:与具体的步骤挂钩,实现子类对父类的反向控制。第二种是:写一个具体实现为空的钩子函数。怎么样,是不是有点晕?其实,钩子的意义很简单。就像我们平常在窗口要一份麻辣烫面,虽然制作麻辣烫面的过程是稳定的,可以看做是一个模板。但是,通常我们可以自主选择是否需要放辣椒、麻油、醋、香菜、葱花等辅料。这个过程就需要我们用到钩子函数了!让它来决定是否执行这些符合个性化的算法步骤。
3.22抽象方法:由抽象类声明,具体实现交给子类。
3.33具体方法:由抽象类、具体类声明并实现,其子类可完全继承也可以进行覆盖。
4、对比
抽象方法VS钩子方法
两者的不同之处:
一个字:“子类如果没有覆盖父类中定义的钩子方法,编译可正常通过,如果没有覆盖父类中声明的抽象方法,编译将报错。”
小结:
里面很多的东西都是初次接触,但是都来自生活。其实是老熟人了。比如:钩子、现实生活中就有钩子啊!让两样东西挂钩,进行关联,一个意思嘛!有什么难的?
PS:好莱坞原则是说“你永远不要联系我,如果有需要我会联系你!”
- 大话设计模式——模板方法(TemplateMethod)
- 大话设计模式--模板方法模式 TemplateMethod -- C++ 实现
- 设计模式——模板方法模式(TemplateMethod Pattern)
- 浅谈JAVA设计模式之——模板方法(TemplateMethod)
- 《大话设计模式》--考题抄错会做也白搭--模板方法模式<TemplateMethod>(10)
- TemplateMethod(模板方法模式)
- 模板方法模式(TemplateMethod)
- 模板方法模式(TemplateMethod)
- 模板方法模式(TemplateMethod)
- 大话设计模式—模板方法模式
- 设计模式 -- 模板方法模式 TemplateMethod
- C++设计模式-TemplateMethod模板方法模式
- 设计模式之模板方法模式(TemplateMethod)
- C++设计模式-TemplateMethod模板方法模式
- 设计模式 模板方法模式 TemplateMethod
- 23设计模式之模板方法(TemplateMethod)
- 23设计模式之模板方法(TemplateMethod)
- TemplateMethod模板方法模式
- poj 1833----排列
- R的一个简单例子
- IE浏览器运行webdriver脚本
- 自动计算顶点缓冲中所有顶点的法线
- L2VPN与L3VPN的详细介绍与对比——MPLS
- 大话设计模式——模板方法(TemplateMethod)
- 尼姆博弈(Nimm Game)
- Python-Matplotlib安装过程简述
- Android 悬浮按钮的简单实现
- HDU 1114
- R基本作图《一》
- 如何解决SqlServer2008修改表结构后无法保存的问题
- 简单计算器(20)
- BZOJ 3275 Number && 3158 千钧一发 最小割