zoukankan      html  css  js  c++  java
  • 【设计模式】装饰模式

    装饰模式(Decorater)

    动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式比生成子类更加灵活。

    装饰模式中有几个关键的地方:

    ①装饰模式依赖于【装饰者】类中有一个父类对象(指针), 而装饰函数(或方法)用来此父类对象(指针)设置实际的动态类型。

    ②因为是要给某个对象增加职责,所以很明显的,在继承体系中,需要在某虚函数中调用其父类的该虚函数,这样才有层层调用的效果。

    下图来源 http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html

    clip_image002

    好,下面自己想一个例子,有时候我常想:要是人会非该多好啊!

    于是幻想有一天有一个白胡子老爷爷(应该是位老神仙)问我:小伙子,现在给你几个技能,你选择一下,会飞会隐身想要钱就来钱想要美女就来美女。这四个你选一个!

    可是选哪个好呢?  会飞? 可以在天上飞啊飞的。 会隐身?那能去女澡堂参观吗?(罪过罪过!!) 想要钱就来钱? 光有钱好还少点什么。 想要美女就来美女? 太多了也吃不消啊!

    不如这样吧,都来来试试呗,先尝后买嘛!

    于是我想四个技能都试试。

    下面代码中只写了【飞】和【隐身】两个技能的代码

    超级父类Person类

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    /************************************************************************
    设计模式3
    装饰模式
    
    用来为某个对象动态的增加操作
    这里有两个操作,一个是【飞】,一个是【隐身】
    有一个装饰者类【技能】类,通过【技能】类设置(装饰函数)Person类指针的动态
    类型,每个继承层次改写Show虚函数,然后两个【飞】【隐身】子类在该Show虚函数
    内部调用其父类【技能】类的虚函数,达到层层包装的作用。
    ************************************************************************/
    class Person
    {
    public: 
        Person(string strName);
        virtual void Show();
    
    protected:
        string m_strName;
    };
    
    Person::Person(string strName)
    {
        m_strName = strName;
    }
    
    void Person::Show()
    {
        cout << "
     I am "<<m_strName<<", 我就是我,是颜色不一样的烟火 !"<<endl;
    }

    【技能】类(装饰者类)

    //【技能】类, 装饰器类
    class Behavier : public Person
    {
    protected:
        Person* m_pPerson;
    
    public:
        Behavier(string strName);
        virtual void Show(); 
        virtual void Decorater(Person* pPerson); //装饰函数
    };
    
    Behavier::Behavier(string strName) : Person(strName){}
    
    void Behavier::Show()
    {
        if (NULL != m_pPerson) m_pPerson->Show();   
    }
    
    void Behavier::Decorater(Person* pPerson)
    {
        m_pPerson = pPerson;
    }

     【飞】类

    //【飞】类
    class Fly : public Behavier
    {
    public: 
        Fly(string strName); 
        virtual void Show(); 
    };
    
    Fly::Fly(string strName) : Behavier(strName){} 
    
    void Fly::Show()
    {
        cout << "
     我会飞啊 哈哈!
    ";
    
        Behavier::Show();
    }

     【隐身】类

    //【隐身】类
    class Hidden : public Behavier
    {
    public: 
        Hidden(string strName); 
        virtual void Show();
    };
    
    Hidden::Hidden(string strName) : Behavier(strName){}
     
    
    void Hidden::Show()
    {
        cout << "
     我会隐身!
    ";
        Behavier::Show();
    }

    main函数以及执行结果

    int _tmain(int argc, _TCHAR* argv[])
    {
        //客户端不会出现【技能】类(装饰者类)
        Person *pPerson = new Person("cuish"); 
        Fly *pFly = new Fly("cuish1");
        Hidden *pHidden = new Hidden("cuish2");
    
        pFly->Decorater(pPerson);
        pHidden->Decorater(pFly);
        pHidden->Show();
    
        cout << endl <<endl;
    
        delete pPerson;
        delete pFly;
        delete pHidden;
    
        return 0;
    }

     

      

  • 相关阅读:
    线性回归的从零开始实现
    比赛总结
    计数学习笔记
    DP计数问题
    多项式学习笔记
    数据结构学习笔记
    子集运算学习笔记
    待学习
    ICPC2018焦作 题解
    ICPC2018焦作 H题 Can You Solve the Harder Problem?
  • 原文地址:https://www.cnblogs.com/cuish/p/3726868.html
Copyright © 2011-2022 走看看