装饰模式实现穿衣搭配 C++

装饰者模式,是可以用来动态的给一个对象添加一些额外的职责, 就增加功能而言, 装饰者模式比生成子类更加灵活。
他是一种为已有功能动态添加更多功能的方式, 新添加的代码, 主要用来装饰原有类的核心职责或者主要行为方式。为某些需要在特定情况下才会使用的特殊行为提供一种解决方案。
另外, 通过把类中的装饰功能从类中搬移出去, 可以简化原有的类, 将类的核心职责和装饰功能区分开来, 可以除去相关类中的重复逻辑。
但是需要注意装饰者模式的装饰顺序。

UML图:
需要注意的是, 按照Java 或者 C# 这类的面向对象语言, Cperson 和 Cdecorator 之间应该是如下的聚合关系, 而我们使用C++编程的时候, 因为C++的引用机制不允许将引用指向一个新的对象, 所以C++ 生成出来的UML图中, 他们之间应该是一个依赖关系。这里被我们改成了聚合关系, 和书本保持一致。

执行效果
装饰模式实现穿衣搭配 C++_第1张图片

代码:
person.h

#ifndef _PERSON_H_
#define _PERSON_H_

#include <iostream>
#include <string>

/************************************************************************/
/* 抽象的 person */
/************************************************************************/
class CPerson{
public: 
 virtual void show() const = 0;
};

#endif // _PERSON_H_

mainperson.h

#ifndef _MAINPERSON_H_
#define _MAINPERSON_H_

#include "Person.h"

/************************************************************************/
/* 具体的person 对象 */
/************************************************************************/
class CConcretePerson : public CPerson{
public:
 CConcretePerson(std::string name) : name(name){}
 void show() const override { std::cout << name << std::endl; }

private:
 std::string name;
};

#endif // _MAINPERSON_H_

decorator.h

#ifndef _DECORATOR_H_
#define _DECORATOR_H_

#include "Person.h"
#include <memory>

/************************************************************************/
/* 装饰者基类 */
/************************************************************************/
class CDecorator : public CPerson{
public:
    void setPerson(const CPerson * _person){
        person = _person;
    }

    void show() const override{
        person->show();
    }

protected:
    const CPerson * person = nullptr;
};

#endif // _DECORATOR_H_

maindecorator.h

#ifndef _MAINDECORATOR_H_
#define _MAINDECORATOR_H_

#include "Decorator.h"

/************************************************************************/
/* Tshirt 装饰 */
/************************************************************************/
class CTshirt : public CDecorator{
public:
 void show() const override{ 
 std::cout << "wear Tshirts, "; 
 CDecorator::show();
 }
};

/************************************************************************/
/* Trousers 装饰 */
/************************************************************************/
class CTrouser : public CDecorator{
public:
 void show() const override{ 
 std::cout << "wear Trousers, "; 
 CDecorator::show();
 }
};

/************************************************************************/
/* shoes 装饰 */
/************************************************************************/
class CShoe : public CDecorator{
public:
 void show() const override{
 std::cout << "wear shoes, ";
 CDecorator::show();
 }
};


#endif // _MAINDECORATOR_H_

main.cpp

#include "MainDecorator.h"
#include "MainPerson.h"

#include <iostream>
#include <memory>
using namespace std;

int main(){
    CTshirt pshirt;
    shared_ptr<CTrouser> ptrouser(new CTrouser());
    CConcretePerson lisi("lisi");
    shared_ptr<CShoe> pshoe(new CShoe());

    pshirt.setPerson(&lisi);
    pshoe->setPerson(&pshirt);
    ptrouser->setPerson(pshoe.get());
    ptrouser->show();

    system("pause");
    return 0;
}

你可能感兴趣的:(设计模式,C++)