zoukankan      html  css  js  c++  java
  • 设计模式学习总结:(2)模板方法模式

    首先我们先来抽象一下。

    模板方法模式:属于行为模式

    意图:

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod是的子类可以不改变算法结构即可定义该算法的某些步骤

    我们可以想象一些现实例子,去淘宝买衣服往往步骤是比较稳定和明确的,我们无非需要 登录淘宝->选择喜欢的产品->下单。这样三个步骤,但是你很快就会发现,尽管登录和下单是两个稳定的步骤,但是,选择商品这一环节可以是时刻变化的。

    比较不好的实现方式是:

    class Base
    {
    public:
        bool login();
        void buy(Good *good);
    }
    
    class App
    {
    public:
        Good *choiceBest();
    }
    
    int main()
    {
        Base a;
        App b;
        if(a.login())
        {
            a.buy(b.choiceBest());
        }
        
    }
    
       

    上面代码,必须等到运行时才能确定步骤,并且由用户来确定。这是没有必要的,因为我们的假定是,这个步骤是恒定不变的,所以,应该采取一种可以更为优秀的做法,那就是模板方法,我们需要一个方法,用来执行这个固定的步骤,也就是一个确定的算法骨架。

    所以,我们运用模板方法模式,我改成这样一种形式:

    class Base
    {
    public :
        bool login();
        virtual Good *choiceBest()=0;
        void buy(Good *good);
        void templateRun()    //重点的模板方法就是我
        {
            if(login())
            {  
                 buy(choiceBest);
            }
        }
    }

    这个是一开始确定的抽象基类,于是,当我们要使用这样一种方法,我们只需要:

    class App:Public Base
    {
    public:
        Good *choiceBest()
        {
           //具体实现
        }
    }

    对抽象的方法进行具体实现。

    运行时:

    int main()
    {
        Base * a = new App();
        a->templateRun();
        delete a;  
    }

    我们只需要关注变化的具体实现。好在回头看看模板方法的定义,怎么样,大概就是这样一种结构图:

    这是书上的结构图,也就是说,一个基本的抽象类,用于定义确定的步骤,和保护一个模板方法,我们只需要定义我们具体的类实现一些后期的步骤即可。

    这里面我们会看到两种函数方法,一种是具体的函数方法还有一种是抽象的函数方法  在c++语法里面我们,通过virtual关键字,并且在声明后面加上=0语法来保证后代一定要实现,具体的讲就是,抽象方法要求后代必须去写它的具体实现。当然事实上,还有一种钩子方法, 如果我们不要求后代必须实现,我们事先有一套缺省的执行实现,那么我们可以把=0去掉,确定为一个钩子方法。

  • 相关阅读:
    深入理解Kafka-学习笔记04-部分生产者客户端参数
    深入理解Kafka-学习笔记03-消息有序性
    IDEA包不存在找不到包解决方案
    深入理解Kafka-学习笔记02-生产者整体架构
    深入理解Kafka-学习笔记01-初识Kafka
    ClickHouse与MySQL数据类型对应
    MySQL查看版本
    从apache phoenix表提取数据为CSV
    Kafka查看版本
    HBASE查看版本
  • 原文地址:https://www.cnblogs.com/wuweixin/p/5420587.html
Copyright © 2011-2022 走看看