简单概述:
小明穿衣案例。平时他上身穿短t恤,下身穿牛仔裤。
- 今天小明准备出去约会,需要精心打扮,决定上身穿西装,下身穿西装裤。
- 明天天气转凉,小明打算上身加多一件外套。
关键点:
- 小明一定会穿上身和下身的衣服
- 上身和下身的衣服可换可加
总结:
在不破坏(改变)原有的功能(上身穿短t恤,下身穿牛仔裤)的条件下,给对象(小明的穿着)动态改变功能(上身穿西装,下身穿西装裤)或添加功能(上身添一件外套)。
上述就是装饰者模式的理解。
个人认为十分有利于版本迭代以及版本切换,即使后续类逐渐增多,通过工厂来管理可以更便捷清楚哪些类与版本相关
UML结构图
代码:
#include <iostream>
#include <string>
class person {
private:
std::string name_;
public:
person() {};
~person() {};
void setName(std::string name) { name_ = name; }
virtual void getPersonName() { std::cout << name_ << std::endl; };
virtual void upDress() { std::cout << "穿t恤" << std::endl; };
virtual void downDress() { std::cout << "穿牛仔裤" << std::endl; };
};
class dress : public person {
protected:
std::shared_ptr<person> object_;
public:
dress() :object_(nullptr) {};
~dress() {};
void setPerson(std::shared_ptr<person> p)
{
object_.reset();
object_ = p;
}
void getPersonName() {
if (object_ != nullptr) object_->getPersonName();
};
void upDress() override {
if (object_ != nullptr) object_->upDress();
};
void downDress() override {
if (object_ != nullptr) object_->downDress();
};
};
//经常穿
class dressOften : public dress {
public:
dressOften() {};
~dressOften() {};
};
//今天穿
class dressSuit : public dress {
public:
dressSuit() {};
~dressSuit() {};
void upDress() override {
std::cout << "穿西装" << std::endl;
};
void downDress() override {
std::cout << "穿西装裤" << std::endl;
};
};
//明天穿
class dressCoat : public dressOften {
public:
dressCoat() {};
~dressCoat() {};
void upDress() override {
dressOften::upDress();
std::cout << "穿外套" << std::endl;
};
};
//还可以通过工厂模式决定
class dressStrategy
{
//相当于换衣室
public:
dressStrategy() {};
~dressStrategy() {};
person* getPersonWithDress(int type, std::string name) {
switch (type)
{
case 0:
{
std::shared_ptr<person> p = std::make_shared<person>(); //有一个穿t恤和牛仔裤的人
p->setName(name); //名叫name
dressSuit* clothes = new dressSuit(); //西装套装
clothes->setPerson(p); //这个人换沈西装套装
return clothes;
}
case 1:
{
std::shared_ptr<person> p = std::make_shared<person>(); //有一个穿t恤和牛仔裤的人
p->setName(name); //名叫name
dressCoat* clothes = new dressCoat(); //穿外套
clothes->setPerson(p); //外套穿这个人身上
return clothes;
}
}
};
};
int main()
{
dressStrategy* ds = new dressStrategy();
person* p1 = ds->getPersonWithDress(0, "小明");//小明今天要约会,要穿西装套装
p1->getPersonName();
std::cout << "今日穿搭:" << std::endl;
p1->upDress();
p1->downDress();
std::cout << std::endl;
person* p2 = ds->getPersonWithDress(1, "小明");
p2->getPersonName();
std::cout << "明日穿搭:" << std::endl;//明天有点冷,小明要穿多一件外套
p2->upDress();
p2->downDress();
}
输出结果: