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章。

  • 相关阅读:
    【转】eclipse修改workspace
    win7+64位+Oracle+11g+64位下使用P…
    Oracle&nbsp;11g&nbsp;R2安装手册(…
    Maven&nbsp;3&nbsp;入门&nbsp;--&nbsp;安装与配置
    JSP+JavaBean+Servlet工作原理实例…
    欢迎您在新浪博客安家
    win7中配置eclipse连接Ubuntu内的hadoop
    Visual Studio 2010 单元测试目录
    spring 面试题
    java集合类
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4084947.html
Copyright © 2011-2022 走看看