Head First设计模式之模板方法模式

一、定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下,重定义该算法中的某些特定步骤。

比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串的操作,操作次序是一样的,有的操作相同,有的不同,将两个连串操作抽象出父类;

子类在相同次序,但具体方法不一样的操作 在父类抽象出来,然后在子类重写实现,达到减少重复代码。

 

二、结构

三、实现

以下以泡茶和泡咖啡为例子

namespace DesignPatterns.Template
{
    /// <summary>
    /// 模版方法
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Tea tea = new Tea();
            tea.PrepareRecipe();

            Console.WriteLine("==== 我是分界线 ====");

            Coffee  coffee = new Coffee();
            coffee.PrepareRecipe();
        }
    }

    public class Tea : Beverage
    {
        public override void Brew()
        {
            Console.WriteLine("冲泡茶叶");
        }

        public override void AddCondiments()
        {
            Console.WriteLine("加柠檬");
        }
    }

    public class Coffee : Beverage
    {
        public override void Brew()
        {
            Console.WriteLine("冲泡咖啡");
        }

        public override void AddCondiments()
        {
            Console.WriteLine("加糖和牛奶");
        }
    }

    public abstract class Beverage
    {
        public void PrepareRecipe()
        {
            BoilWater();
            Brew();
            PourInCup();
            AddCondiments();
        }

        public abstract void Brew();
        public abstract void AddCondiments();

        public void BoilWater()
        {
            Console.WriteLine("泡开水");
        }

        public void PourInCup()
        {
            Console.WriteLine("倒进杯子");
        }
    }
}

结果:

泡开水
冲泡茶叶
倒进杯子
加柠檬
==== 我是分界线 ====
泡开水
冲泡咖啡
倒进杯子
加糖和牛奶
请按任意键继续. . .

四、适用场景

在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

 

五、优缺点

优点:

模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

子类实现算法的某些细节,有助于算法的扩展。

通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点:

每个不同的实现都需要定义一个子类,导致类的个数增加,设计更加抽象;

子类的实现也可以影响父类中主逻辑的运行,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。

 

欢迎阅读本系列文章:Head First设计模式之目录

 

时间: 2024-09-20 05:34:49

Head First设计模式之模板方法模式的相关文章

C#设计模式(14)——模板方法模式(Template Method)

原文:C#设计模式(14)--模板方法模式(Template Method) 一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模

乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) 作者:webabcd 介绍 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 示例 有一个Message实体类,对它的操作有Get()方法,每次Get()之前要使用ValidateUs

C++设计模式之模板方法模式_C 语言

前言 离开了自己工作了将近两年的公司,日子不再有了忙碌,可以闲下来,躺在家里的床上,想着以后的路怎么走,说实话,真的很迷茫,从2012年毕业到现在,时间不长,但是学到的东西真的是非常有限,一直从事于Windows平台上的开发.说到Windows平台的开发,大家都肯定知道的HOOK的,即使不知道HOOK,对于COM应该也是知道的,我的系列博文中也对COM进行过全面的总结.说白了,HOOK就是在执行某个功能时,会有一个一系列的执行过程,对于这个过程一般都是固定的,比如:第一步执行什么,第二步干什么,

【设计模式】模板方法模式

[什么是设计模式]     官方解释:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 设计模式大咖闫宏解释:模板方法模式是类的行为型模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. [模板类图] 可以看出,模板方法模式由两部分组成:       (1

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

 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.一次性的实现一个算法的不变部分,并将可变的行为留给子类来实现.  模板方法的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑.  模板方法模式中的方法可以分为两大类:模板方法和基本方法. 1 模板方法  一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法.  一个抽

大话设计模式之模板方法模式

          模板?生科的小朋友或许会这样理解,DNA复制或转录时,用来产生互补链的核苷酸序列.在我们的日程生活中,我们也时常与模板打交道,比如有些师哥师姐毕业了,需要写简历应聘,这个时候就有了简历模板:临近毕业大四的孩子,需要准备论文,就有了论文模板,所以,模板的概念就是有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新完善它,例如简历模板,从网上down下来的简历模板的格式都是相同的,要想拿到一份满意的offer,我们首先要根据自己的情况填充不同的内容完成属于自己的简历,拿到

学习JavaScript设计模式之模板方法模式_javascript技巧

一.定义 模板方法是基于继承的设计模式,可以很好的提高系统的扩展性. java中的抽象父类.子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类. 二.示例 Coffee or Tea (1) 把水煮沸 (2) 用沸水浸泡茶叶 (3) 把茶水倒进杯子 (4) 加柠檬 /* 抽象父类:饮料 */ var Beverage = function(){}; // (1) 把水煮沸 Beverage.prototype.boilWater = function() { conso

设计模式——14模板方法模式(Template Method)

14.模板方法模式(Template Method)解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用. 就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用

重温设计模式(七)——模板方法模式

1.摘要 在本文中,我们来对模板方法模式做一个全面的了解. 2.求职简讯 呵呵,如果各位不介意,希望在这里做一个求职的广告. 语言方向:Java/C#/VB,语言熟悉程度降序排列. 求职方向:开发,测试等与IT相关工作. 月薪要求:1000元以上 工作地点:北京 3.开门见山 模板方法,定义一个操作中算法骨架,而将一些步骤延迟到子类中去实现. 让我们先来看看模板方法的示意图: 这个模式的本身很容易理解,我就不自己去画了. 我们看到这个模式的关键在于父类中的TemplateMethod()方法,正