zoukankan      html  css  js  c++  java
  • 【设计模式】模板方法模式

    所谓模板方法模式,就是在在抽象基类中定义一套算法框架,框架内的步骤由各个派生类去实现。模板方法模式的优点在于,具有同样代码的操作提升至抽象基类中,派生类中仅仅实现具有差异性的代码,从而最大程度降低了反复代码的存在。要注意的是,这里的模板方法和C++中的模板函数没有不论什么关系。模板方法模式的UML图例如以下:



    以下以一个用C++描写的简单演示样例来说明模板方法模式的机制。

    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class Introduce {
    public:
        // 操作框架
        void speak()
        {
            cout << "Hello everyone! My name is " << name() << ", I'm " << age() << " years old.
    ";
        }
     
    protected:
        // 依据不同的实例,由派生类进行重写
        virtual string name() = 0;
        virtual int age() = 0;
    };
     
    class IntroduceFoo : public Introduce {
     
        virtual string name()
        {
            return string("Foo");
        }
     
        virtual int age()
        {
            return 18;
        }
    };
     
    class IntroduceBar : public Introduce {
     
        virtual string name()
        {
            return string("Bar");
        }
     
        virtual int age()
        {
            return 22;
        }
    };
     
    int main()
    {
        Introduce *foo = new IntroduceFoo();
        Introduce *bar = new IntroduceBar();
     
        foo->speak();
        bar->speak();
     
        // 别忘了删除指针
        delete foo;
        delete bar;
     
        system("pause");
        return 0;
    }

    执行结果:


    在这个样例中,我写了一个关于自我介绍的类。这里如果自我介绍的内容遵循同一个模板,那么内容中同样的部分是许多的,差异也仅仅在于姓名和年龄的不同。因此,我们把自我介绍的一大段文字提升到基类中,而名字、年龄则由各个派生类去实现。“特异性”凌驾于“不变性”,所以使用了虚函数。派生类中对虚函数的重写很easy,仅仅须要描写叙述跟自己相关的信息就可以。当有其它人须要自我介绍时,仅仅须要继承Introduce抽象基类,返回自己的信息就能够了。模板已经在基类中搭好,剩下的扩充是很灵活的。

    參考:

    《大话设计模式》第10章。

  • 相关阅读:
    CSS——制作天天生鲜主页
    HTML——制作一个图片列表
    HTML——制作一个简易菜单栏
    CSS——三种页面引入方法
    【20170903】模拟赛
    【LA 3942】 Remember the word
    【BZOJ 1036】 树的统计count
    UVA 12299 RMQ with shifts
    【20170706】次短路
    【20170706】保卫萝卜
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4084947.html
Copyright © 2011-2022 走看看