模板方法方式体现了面向对象的洋洋首要思想,定义三个操作中算法的框架

情势动机
图片 1

上一篇:017-设计格局二:适配器形式(Adapter)

1. 定义

模板方法形式:概念3个操作中算法的框架,而将有个别手续延迟到子类中。模板方法形式使得子类能够不转移八个算法的布局即可重定义该算法的有个别特定步骤。

Template Method Pattern: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个叫做模板方法的章程来定义那些基本方法的实施顺序,而经过其子类来覆盖有些步骤,从而使得同一的算法框架能够有分化的推行结果。模板方法情势提供了二个模板方法来定义算法框架,而有个别具体步骤的贯彻能够在其子类中达成。

模板方法方式是根据继承的代码复用基本技巧,模板方法形式的布局和用法也是面向对象设计的中心之一。在模板方法方式中,可以将同一的代码放在父类中,而将分裂的点子完结放在分化的子类中。
在模板方法方式中,大家须要积谷防饥三个抽象类,将一些逻辑以具体方法以及实际构造函数的样式完成,然后声可瑞康些抽象方法来让子类完毕多余的逻辑。区别的子类能够以差别的主意贯彻这几个抽象方法,从而对结余的逻辑有例外的实现,那正是模板方法格局的意向。模板方法方式体现了面向对象的无数要害思想,是一种选择功能较高的情势。

一、说白了

所谓模板方法形式,说白了便是:例如小编请客吃饭,步骤就是点菜、吃东西、结账。点菜和结账固定不变,吃东西我们只通晓要吃,但现实吃哪些放到子类里实现。那就形成了一种模板。

图片 2

图表源于于互连网.jpg

2. 模板方法情势协会与落到实处

格局定义
模板方法情势(Template Method
Pattern):定义3个操作中算法的骨架,而将部分步骤延迟到子类中,模板方法使得子类能够不改动三个算法的组织即可重定义该算法的一些特定步骤。模板方法是一体系行为型格局
Template Method Pattern: 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.
Frequency of use: medium
UML图
图片 3

二、定义

模板方法情势:定义3个操作中算法的框架,而将一部分步骤延迟到子类中。模板方法格局使得子类能够不更改三个算法的结构即可重定义该算法的少数特定步骤。

Template Method Pattern: 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.1 形式社团

模板方法形式组织相比简单,其大旨是抽象类和里面包车型的士模板方法的宏图,其组织如图所示:

图片 4

由图能够,模板方法格局涵盖如下四个剧中人物:

(1)
AbstractClass(抽象类):
在抽象类中定义了一多元基本操作(PrimitiveOperations),那几个基本操作能够是切实的,也能够是架空的,每多个基本操作对应算法的三个手续,在其子类中得以重定义或落到实处那个手续。同时,在抽象类中落到实处了1个模板方法(Template
Method),用于定义三个算法的框架,模板方法不但能够调用在抽象类中落实的主干格局,也足以调用在抽象类的子类中完成的大旨办法,还足以调用别的对象中的方法。

(2)
ConcreteClass(具体子类):
它是抽象类的子类,用于落实在父类中注解的指雁为羹基本操作以成就子类特定算法的手续,也足以覆盖在父类中曾经完毕的现实性基本操作。

方式组织
模板方法情势涵盖如下角色:
AbstractClass: 抽象类
ConcreteClass: 具体子类

三、类型

模板方法形式是一种基于继承的代码复用技术,它是一体系行为型格局。

模板方法情势是构造最简便的行为型设计方式,在其布局中只存在父类与子类之间的后续关系。通过采纳模板方法情势,能够将一些复杂流程的完毕步骤封装在一多级基本办法中,在空虚父类中提供三个叫作模板方法的不二法门来定义那些骨干形式的执行顺序,而由此其子类来掩盖有些步骤,从而使得同一的算法框架能够有两样的实施结果。模板方法情势提供了1个模板方法来定义算法框架,而有个别具体步骤的落实能够在其子类中形成。

2.2 方式完成

在贯彻模板方法模式时,开发抽象类的软件设计师和费用具体子类的软件设计师之间能够拓展合作。3个设计师负责给出1个算法的轮廓和框架,另一些设计师则负责给出那一个算法的顺序逻辑步骤。完结那么些实际逻辑步骤的艺术即为基本格局,而将这么些骨干方法汇总起来的不二法门即为模板方法,模板方法方式的名字也由此而来。上边将详细介绍模板方法和基本措施:

1. 模板方法

贰个模板方法是概念在抽象类中的、把基本操作方法结合在一道形成3个总算法或1个总作为的方法。这一个模板方法定义在抽象类中,并由子类不加以修改地全盘继承下来。模板方法是三个具体方法,它交给了三个顶层逻辑框架,而逻辑的结缘步骤在抽象类中得以是具体方法,也足以是抽象方法。由于模板方法是具体方法,因而模板方法格局中的抽象层只好是抽象类,而不是接口。

2. 主干方法

主干格局是贯彻算法各类步骤的主意,是模板方法的组成都部队分。基本办法又足以分为三种:抽象方法(Abstract
Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

(1)抽象方法:3个浮泛方法由抽象类注脚、由其实际子类达成。在C#语言里3个空洞方法以abstract关键字标识。

(2)具体方法:一个具体方法由一个抽象类或具体类声明并达成,其子类能够实行覆盖也足以一直接轨。

(3)钩子方法:一个钩子方法由八个抽象类或具体类证明并达成,而其子类大概会加以扩充。日常在父类中付出的兑现是多个空实现(可采纳virtual关键字将其定义为虚函数),并以该空达成作为艺术的私下认可实现,当然钩子方法也得以提供叁个非空的私下认可实现。

方式分析
模板方法情势是一品类的行为型形式,在它的布局图中唯有类之间的持续关系,没有对象关联关系。
在模板方法形式的利用进程中,须要支付抽象类和支出具体子类的设计师之间开始展览同盟。叁个设计师负责给出四个算法的概略和骨架,另一部分设计师则负责给出这一个算法的种种逻辑步骤。达成那些具体逻辑步骤的措施称为基本格局(Primitive
Method),而将那一个基本法方法汇总起来的不二法门称为模板方法(Template
Method),模板方法方式的名字之后而来。

四、场景

气象一:几个子类有公共艺术,并且逻辑基本相同

场景二:重复、复杂算法,将着力算法设计为模板方法方式,其广大的细节可以有子类去实现

情景三:代码重构(经常意况下就会用到模版方法格局)

模板方法方式是依据继承的代码复用技术,它反映了面向对象的成都百货上千至关心珍惜要思想,是一种选拔比较频仍的方式。模板方法方式广泛应用于框架设计中,以保障通过父类来支配处理流程的逻辑顺序(如框架的起初化,测试流程的装置等)。

在以下情状下得以考虑选用模板方法格局:

(1)
对一些扑朔迷离的算法进行剪切,将其算法中一定不变的部分统一筹划为模板方法和父类具体方法,而有个别得以变动的细节由其子类来落到实处。即:1遍性完结贰个算法的不变部分,并将可变的行事留给子类来完毕。

(2) 各子类中中原人民共和国有的作为应被提取出来并集中到一个集体父类中以幸免代码重复。

(3)
要求通过子类来控制父类算法中某些步骤是或不是进行,实现子类对父类的反向决定。

3. 结构实例

图片 5

模板方法:三个模板方法是概念在抽象类中的、把基本操作方法结合在一块形成二个总算法或三个总作为的法子。
宗旨方法:基本方法是落到实处算法各样步骤的法门,是模板方法的组成都部队分。
 抽象方法(Abstract Method)
 具体方法(Concrete Method)
 钩子方法(Hook Method):“挂钩”方法和空方法

伍 、剧中人物划分

剧中人物一:抽象类(定义了算法架构,将有个别一定的步子延时到子类实现)

角色二:具人体模型版类(不改动算法结构)

角色三:客户端

不等的接头分裂的分割,也足以让模板方法形式驾驭成如下八个剧中人物:

(1)
AbstractClass(抽象类):在抽象类中定义了一星罗棋布基本操作(PrimitiveOperations),那个基本操作能够是现实性的,也能够是架空的,每1个基本操作对应算法的二个手续,在其子类中能够重定义或促成那些手续。同时,在抽象类中达成了一个模板方法(Template
Method),用于定义叁个算法的框架,模板方法不仅能够调用在抽象类中达成的大旨办法,也得以调用在抽象类的子类中落到实处的骨干措施,还能调用其余对象中的方法。

(2)
ConcreteClass(具体子类):它是抽象类的子类,用于落实在父类中注明的悬空中基地本操作以形成子类特定算法的步骤,也能够覆盖在父类中曾经落到实处的切切实实基本操作。

4. 代码实现

using UnityEngine;

public class DM04TempleMethod:MonoBehaviour
{
    void Start()
    {
        IPeople people=new NorthPeople();
        people.Eat();
    }
}

public abstract class IPeople
{
    public void Eat()
    {
        OrderFoods();
        EatSomething();
        PayBill();
    }

    private void OrderFoods()
    {
        Debug.Log("点单");
    }

    protected virtual void EatSomething()
    {

    }

    private void PayBill()
    {
        Debug.Log("买单");
    }
}

public class NorthPeople : IPeople
{
    protected override void EatSomething()
    {
        Debug.Log("我在吃面条");
    }
}

public class SouthPeople : IPeople
{
    protected override void EatSomething()
    {
        Debug.Log("我在吃米饭");
    }
}

在模板方法方式中,由于面向对象的多态性,子类对象在运营时将覆盖父类对象,子类中定义的方法也将掩盖父类中定义的方法,由此先后在运维时,具体子类的大旨方法将掩盖父类中定义的中坚办法,子类的钩子方法也将覆盖父类的钩方法,从而能够透过在子类中贯彻的钩子方法对父类方法的实行进行约束,完成子类对父类行为的反向决定。

⑥ 、基本方法

主导格局是落到实处算法种种步骤的点子,是模板方法的组成都部队分。基本办法又有啥不可分为二种:抽象方法(Abstract
Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

(1)
抽象方法:一个架空方法由抽象类注明、由其实际子类达成。在C#语言里三个华而不实方法以abstract关键字标识。

(2)
具体方法:三个具体方法由2个抽象类或具体类申明并促成,其子类可以拓展覆盖也足以直接接轨。

(3)
钩子方法:一个钩子方法由二个抽象类或具体类注脚并落到实处,而其子类可能会加以扩充。常常在父类中付出的完成是一个空达成(可利用virtual关键字将其定义为虚函数),并以该空达成作为艺术的暗许达成,当然钩子方法也能够提供叁个非空的暗中认可实现。

在模板方法格局中,钩子方法有两类:第三类钩子方法能够与部分具体步骤“挂钩”,以促成在差别口径下执行模板方法中的区别步骤,那类钩子方法的回到类型一般是bool类型的,用于对有个别条件举行判定,假诺条件满足则实施某一步骤,不然将不进行。

方式实例与分析
课题抄错会做也白搭—模板方法情势
系统布局
图片 6
TestPaper.cs

using System;

namespace TemplateMethodPattern
{
    //金庸小说考题试卷
    class TestPaper
    {
        //试题1
        public void TestQuestion1()
        {
            Console.WriteLine("杨过得到,后来给了,炼成倚天剑、屠龙刀的玄铁是[] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维");
            Console.WriteLine("答案:" + Answer1());
        }
        //试题2
        public void TestQuestion2()
        {
            Console.WriteLine("杨过、程英、陆无双铲除了情花,造成[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化");
            Console.WriteLine("答案:" + Answer2());
        }
        //试题3
        public void TestQuestion3()
        {
            Console.WriteLine("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对");
            Console.WriteLine("答案:" + Answer3());
        }

        protected virtual string Answer1()
        {
            return "";
        }
        protected virtual string Answer2()
        {
            return "";
        }
        protected virtual string Answer3()
        {
            return "";
        }
    }
}

TestPaperA.cs

using System;

namespace TemplateMethodPattern
{
    //学生甲抄的试卷
    class TestPaperA : TestPaper
    {
        //试题1
        public new void TestQuestion1()
        {
            base.TestQuestion1();
        }
        //试题2
        public new void TestQuestion2()
        {
            base.TestQuestion2();
        }
        //试题3
        public new void TestQuestion3()
        {
            base.TestQuestion3();
        }
        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "a";
        }
        protected override string Answer3()
        {
            return "c";
        }
    }
}

TestPaperB.cs

using System;

namespace TemplateMethodPattern
{
    //学生乙抄的试卷
    class TestPaperB : TestPaper
    {
        //试题1
        public new void TestQuestion1()
        {
            base.TestQuestion1();
        }
        //试题2
        public new void TestQuestion2()
        {
            base.TestQuestion2();
        }
        //试题3
        public new void TestQuestion3()
        {
            base.TestQuestion3();
        }
        protected override string Answer1()
        {
            return "d";
        }
        protected override string Answer2()
        {
            return "b";
        }
        protected override string Answer3()
        {
            return "a";
        }
    }
}

Client:客户类

using System;

namespace TemplateMethodPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("学生甲抄的试卷:");
            TestPaper studentA = new TestPaperA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();

            Console.WriteLine("学生乙抄的试卷:");
            TestPaper studentB = new TestPaperB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion3();

            Console.Read();
        }
    }
}

形式优缺点
模板方法方式的帮助和益处
 模板方法情势在3个类中形式化地定义算法,而由它的子类达成细节的处理。
 模板方法方式是一种代码复用的骨干技巧。

模板方法情势导致一种反向的控制结构,通过二个父类调用其子类的操作,通过对子类的恢宏扩充新的一颦一笑,符合“开闭原则”。

模板方法方式的瑕疵

每一个不相同的兑现都亟需定义三个子类,那会招致类的个数扩大,系统进一步高大,设计也尤为空虚,不过越来越切合“单一义务规范”,使得类的内聚性得以升高。

格局适用条件
在以下情况下得以选择模板方法形式:
 贰遍性完成二个算法的不变的局地,并将可变的一举一动留给子类来完结。
 各子类中中原人民共和国有的一言一动应被提取出来并汇总到二个公共父类中以制止代码重复。

对一些扑朔迷离的算法进行剪切,将其算法中一定不变的某个布置为模板方法和父类具体方法,而有的足以变动的细节由其子类来落到实处。
 控制子类的扩张。

【证明与谢谢】
本文,站在广大高个子的肩头上,借鉴和引用了广大旁人拥有版权的著述或撰文,在此,对前人们的进献致谢。并同时公布引用的始末、原来的书文者或出自(一些来自网络的内容作者不能够追述本源,深表遗憾)。

【参考文献】
《设计形式—可复用面向对象软件的根底》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改进既有代码的统筹》小编: 马丁 Fowler译者:候捷
中夏族民共和国电力出版社
《敏捷软件开发—原则、模式与实施》小编: 罗Bert C. Martin 南开东军事和政治高校学出版社
《程序员修炼之道—从小工到大方》作者: Andrew Hunt / 戴维 Thomas电子工业出版社
《Head First 设计格局》笔者: Freeman 译者: O’Reilly Taiwan公司中夏族民共和国电力出版社
《设计方式之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计格局纵横谈》 教师:李建忠
刘伟(Liu-Wei). 设计格局. 香水之都:北大大学出版社, 二零一一.
Liu Wei. 设计方式实训教程. 香岛:南开东军事和政院学出版社, 二零一二.
《大话设计格局》 小编: 程杰 武大东军大学出版社
《C#图解教程》笔者: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你不可能不知道的.NET》作者: 王涛
《项目中的.NET》小编: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构划设想计》小编: (美)埃斯波西托等创作 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客笔者:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客作者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客作者:阿伦 lee
http://blog.csdn.net/ai92 博客笔者:ai92
http://www.cnblogs.com/umlonline/ 博客我:张传波
http://www.cnblogs.com/lovecherry/ 博客作者:LoveCherry

相关文章