zoukankan      html  css  js  c++  java
  • 小话设计模式五:模板方法模式

    模板方法模式定义:

      定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

    模板方法解析:

      模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的技术,在类库中尤其重要,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。作为模板的方法要定义在父类中,在方法的定义中使用到抽象方法,而只看父类的抽象方法是根本不知道怎样处理的,实际做具体处理的是子类,在子类中实现具体功能,因此不同的子类执行将会得出不同的实现结果,但是处理流程还是按照父类定制的方式。这就是模板方法的要义所在,制定算法骨架,让子类具体实现。 

      UML图如下:

      简单示例代码如下:

    //人类基类
    class Person
    {
    public:
        virtual ~Person(){};
        void eatFood();
    protected:
        Person(){}
        virtual void eatBreakfast() = 0;
        virtual void eatLunch() = 0;
        virtual void eatSupper() = 0;
    };
    
    void Person::eatFood()  //一天吃饭顺序是固定的,先吃早餐,再吃午餐,最后吃晚餐,但是吃的东西确实不同人有不同的吃法
    {
        eatBreakfast();
        eatLunch();
        eatSupper();
    }
    
    //胖子
    class FatPerson : public Person
    {
    protected:
        virtual void eatBreakfast();
        virtual void eatLunch();
        virtual void eatSupper();
    };
    
    void FatPerson::eatBreakfast()
    {
        cout<<"早餐:不吃"<<endl;
    }
    
    void FatPerson::eatLunch()
    {
        cout<<"午餐:一碗白饭加青菜"<<endl;
    }
    
    void FatPerson::eatSupper()
    {
        cout<<"晚餐:一个苹果"<<endl;
    }
    
    //瘦子
    class ThinPerson : public Person
    {
    protected:
        virtual void eatBreakfast();
        virtual void eatLunch();
        virtual void eatSupper();
    };
    
    void ThinPerson::eatBreakfast()
    {
        cout<<"早餐:一杯牛奶加一个汉堡"<<endl;
    }
    
    void ThinPerson::eatLunch()
    {
        cout<<"午餐:两碗白饭加两荤一素"<<endl;
    }
    
    void ThinPerson::eatSupper()
    {
        cout<<"晚餐:一碗白饭加青菜外加一个苹果"<<endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Person *pPerson = new ThinPerson;
        pPerson->eatFood();
        delete pPerson;
    
        return 0;
    }
  • 相关阅读:
    Twitter的分布式自增ID算法snowflake (Java版)
    quartz获取缓存中所有运行中的Job
    Git简易的命令入门
    Eclipse新建Maven工程——git篇
    Spring基于AspectJ的AOP的开发——注解
    Quartz-Spring定时任务器持久化,通过Service动态添加,删除,启动暂停任务
    用windows命令解压chm文件
    播放器
    ab压力测试
    自定义事件javascript
  • 原文地址:https://www.cnblogs.com/venow/p/2755895.html
Copyright © 2011-2022 走看看