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

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

       在设计模式中,模板方法模式中模板和生活中模板概念非常类似。模板方法模式——在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家down的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。来看一下我们模板方法模式的结构图:

         

        除了简历模板之外,我们再来举一个生活中的故事,而我就是这个故事中傻傻的主角儿,这几天饭卡里没有钱了,人是铁饭是钢,一顿不吃饿得慌,虽然说减肥刻不容缓,可是真理说的好啊,不吃饱哪儿来的力气减肥啊,周二下午四点来到工商银行ATM机钱取钱,奇怪,为什么密码不对呢?无奈,再来一次,就这样连续三次,我的银行卡光荣的被锁住了,拔出银行卡一看,我看见了什么,上面赫然写着,邮政储蓄,原来我把邮政储蓄的卡当成了工行的卡,两个卡的密码不一样,我在工行取钱,插到ATM机的是邮政的卡,按的密码是邮政银行卡的密码,所以,才发生了刚才那不堪回首的一幕,没有办法,去前台把卡给解锁了,这样才能有力气减肥。

       来到服务厅,人真多啊,在银行办理业务时,一般我们都按照这样的步骤依次进行,取号排队,办理具体业务,对银行工作人员进行评分,这样一套工作流程不就是我们的模板方法模式?我们先来看看这个例子的类图:

             

            有了类图,我们的代码需要如何实现呢:

             

// 客户端调用
    class Client
    {
        static void Main(string[] args)
        {
            // 创建一个办业务流程实例并调用模板方法
            Business business = new  Business();
            business. Flow();
            Console.Read();
        }
    }

    public abstract class Business
    {
        // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序
        public  void Flow()
        {
            Console.WriteLine("办理业务的一般流程");
            this.LineUp();            //取号排队
            this.Manage();            //办理具体业务
            this.Graded();     //对银行工作人员进行评分

        }

        // 第一步取号排队
        public  void LineUp()
        {
            Console.WriteLine("取号排队");
        }

        // 第二步办理具体业务
        public  void Manage()
        {
            Console.WriteLine("办理具体业务");
        }

        // 第三步对银行工作人员进行评分
        public  void Graded()
        {
            Console.WriteLine("对银行工作人员进行评分");
        }
    }

    // 顾客A
    public class  Business: Flow
    {

        public override void  Business()
        {
            Console.WriteLine("顾客A办理业务");
        }
    }

    // 顾客B
    public class  Business : Flow
    {
        public override void  Business()
        {
            Console.WriteLine("顾客B办理业务");
        }
    }

            经过银行姐姐的辛苦工作,我的卡终于解锁了,以后做事情要小心一点,不能这么马虎了,都这么大个人了,是吧,言归正传,模板方法模式--准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。设计之旅,未完待续.......

时间: 2024-09-09 23:07:59

大话设计模式之模板方法模式的相关文章

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

大话设计模式之原型模式

       外国人把那京戏叫做"Beijing Opera " 没见过那五色的油彩楞往脸上画,四击头一亮相,(哇--)美极了妙极了,简直"ok"顶呱呱 ,蓝脸的多尔敦盗御马,红脸的关公战长沙 ,黄脸的典韦白脸的曹操 ,黑脸的张飞叫喳喳-- ,细心的小朋友,仔细区分就会发现,虽然每个京剧演员都不同,但基本上只具有几种脸型,长方形,圆形,细长,然后配上不同的妆容,胡子,眉毛,头饰,服装,有的再加点儿装饰物,就成了我们所看到的不同的演员角色,国粹和我们的编程有着什么样的

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

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

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

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

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

一.定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下,重定义该算法中的某些特定步骤. 比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串的操作,操作次序是一样的,有的操作相同,有的不同,将两个连串操作抽象出父类: 子类在相同次序,但具体方法不一样的操作 在父类抽象出来,然后在子类重写实现,达到减少重复代码.   二.结构 三.实现 以下以泡茶和泡咖啡为例子 namespace DesignPatterns.Template { //

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

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