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


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

           在设计模式中,模板方法模式中模板和生活中模板概念很类似。

    模板方法模式——在一个抽象类中定义一个操作中的算法骨架(相应于生活中的大家down的模板)。而将一些步骤延迟到子类中去实现(相应于我们依据自己的情况向模板填充内容)。模板方法使得子类能够不改变一个算法的结构前提下,又一次定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中。从而去除了子类中的反复代码。

    来看一下我们模板方法模式的结构图:

             

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

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

                 

                有了类图,我们的代码须要怎样实现呢:

                 

    // client调用
        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办理业务");
            }
        }
                经过银行姐姐的辛苦工作。我的卡最终解锁了,以后做事情要小心一点,不能这么马虎了,都这么大个人了。是吧。言归正传。模板方法模式--准备一个抽象类,将部分逻辑以详细方法以及详细构造子的形式实现。然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

    这就是模版方法模式的用意。设计之旅,未完待续.......

  • 相关阅读:
    google git的使用方法
    C/C++ 开发库 | C/C++ Development Library
    log4cplus c++开源日志系统
    c++配置类
    Markdown基础语法
    Nhibernate 映射关系,一对多 多对一与多对手在映射文件中的体现。
    Nhibernate refers to an unmapped class nhibernate问题的解决(初学者)
    UICollectionView的使用
    Runloop
    UITableView(转)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6919630.html
Copyright © 2020-2023  润新知