以笔记本电脑为例,当我们购买了一台新笔记本电脑,但我们发现写代码时,屏幕太小,费眼睛,这时候我们有购买了一个24寸的显示器有了显示器又觉得键盘不舒服,这时候购买了一把机械键盘,陆陆续续又购买了鼠标、USB拓展坞。
这时我们再回头看,发现笔记本电脑没有做任何的修理,但我们为笔记本拓展了显示器、键盘、鼠标等外设,这些外设不属于笔记本电脑,同时笔记本没有这些外设(一个或多个)也可以正常工作。这就是装饰器的原理
我们这里以手机为例,手机的最初功能就是打电话,后来随着智能手机的出现,又开始有了WIFI、拍照等等的功能
class I_Phone {
public:
virtual ~I_Phone(){};
virtual void ShowFunction() = 0;
};
class XiaoMi : public I_Phone {
public:
void ShowFunction() { cout << "This is XiaoMi Moblie Phone" << endl; }
};
class ViVo : public I_Phone {
public:
void ShowFunction() { cout << "This is ViVo Moblie Phone" << endl; }
};
class Apple : public I_Phone {
public:
void ShowFunction() { cout << "This is Apple Moblie Phone" << endl; }
};
//5G
class Decorator_5G : public I_Phone {
public:
Decorator_5G(std::shared_ptr<I_Phone> phone) : i_phone_(phone) {}
void ShowFunction()
{
i_phone_->ShowFunction();
cout << "Function:5G" << endl;
}
private:
std::shared_ptr<I_Phone> i_phone_;
};
//拍照
class Decorator_Camera : public I_Phone {
public:
Decorator_Camera(std::shared_ptr<I_Phone> phone) : i_phone_(phone) {}
void ShowFunction()
{
i_phone_->ShowFunction();
cout << "Function:Camera" << endl;
}
private:
std::shared_ptr<I_Phone> i_phone_;
};
//云服务
class Decorator_CloudService : public I_Phone {
public:
Decorator_CloudService(std::shared_ptr<I_Phone> phone) : i_phone_(phone) {}
void ShowFunction()
{
i_phone_->ShowFunction();
cout << "Function:CloudService" << endl;
}
private:
std::shared_ptr<I_Phone> i_phone_;
};
int main()
{
//最初只有三款手机
std::shared_ptr<I_Phone> mi_ = std::make_shared<XiaoMi>();
std::shared_ptr<I_Phone> vivo_ = std::make_shared<ViVo>();
std::shared_ptr<I_Phone> apple_ = std::make_shared<Apple>();
//XiaoMi公司给手机拓展的功能
std::shared_ptr<I_Phone> mi_decorate_ = std::make_shared<Decorator_5G>(mi_);
mi_decorate_ = std::make_shared<Decorator_Camera>(mi_decorate_);
mi_decorate_->ShowFunction();
cout << endl;
//vivo公司给手机拓展的功能
std::shared_ptr<I_Phone> vivo_decorate_ = std::make_shared<Decorator_Camera>(vivo_);
vivo_decorate_->ShowFunction();
cout << endl;
//Apple公司给手机拓展的功能
std::shared_ptr<I_Phone> apple_decorate_ = std::make_shared<Decorator_Camera>(apple_);
apple_decorate_ = std::make_shared<Decorator_CloudService>(apple_decorate_);
apple_decorate_ = std::make_shared<Decorator_5G>(apple_decorate_);
apple_decorate_->ShowFunction();
cout << endl;
return 0;
}

装饰器模式的优缺点
优点:
缺点:
装饰器模式与其他模式的比较