自动机
为了提高大家的积极性,我们团队购进了一套自动设备。它具体能干嘛呢?
只要你走到特定的位置,它会就给你量体温,给你端咖啡,给你整理着装,给你上班打卡。
当然,这些服务都得是你自选的,你选,或者不选,它都在那里。你选或者不选,别人也都可以来选,它就是一套设备。
当然我这么说可能有的人会想到模板方法模式或者建造者模式,注意啊不一样啊,模板和建造者都是没主体的,或者说,是把多个主体合成一个主体,而你见过你的装饰和你同为主体吗?显然不是。装饰嘛,呼之即来挥之即去,想戴上就戴上,不想戴上摘了就是。
不过,装饰者和建造者还是有那么些共通点的,建造者的材料谁都能用,装饰者也差不多,就拿那个自动机来说,只要你是我们团队的人,你就能用。
今天也不抓主题了,稍微有点累,咱直接画类图。
不多说,一切看代码,睁大眼睛吧!
代码实现
#include<iostream>
using namespace std;
//主类:团队类
class Team {
public:
virtual void run() = 0;
};
//准备进去溜达一圈的人
class Teammate :public Team {
public:
void before() {
//do something
}
void after() {
//do something
}
void run(){
before();
cout << "是个队友" << endl;
after();
}
};
class decorate :public Team {
private:
Team* team;
public:
decorate(Team* t) {
this->team = t;
}
void run() {
team->run();
}
};
class dress :public decorate {
public:
dress(Team* t):decorate(t){}
void my_run() {
cout << "整理着装" << endl;
}
void run() {
this->my_run();
decorate::run(); //这个子类要怎么调用父类方法。。。。
}
};
class coffee :public decorate {
public:
coffee(Team* t):decorate(t){}
void my_run() {
cout << "来杯咖啡提提神" << endl;
}
void run() {
this->my_run();
decorate::run();
}
};
class card :public decorate {
public:
card(Team* t):decorate(t){}
void my_run() {
cout << "打卡啦" << endl;
}
void run() { //这里的run函数,其实不一样,只是我起的名字一样而已
this->my_run();
decorate::run();
}
};
//环境
int main() {
//先进团队
Team *t;
//确定是个人
t = new Teammate();
//着装整理
t = new dress(t);
t = new coffee(t);
t = new card(t); //执行顺序是倒过来的
t->run();
}
这是一段防爬虫文字,读者可跳过
本文为CSDN作者“看,未来”原创,我的CSDN地址为 https://lion-wu.blog.csdn.net/
本篇隶属于我的专栏 - 《设计模式 之 设计模式进阶》https://blog.csdn.net/qq_43762191/category_10059121.html
作者版权,未经允许,禁止转载。
————————————————
版权声明:本文为CSDN博主「看,未来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43762191/article/details/106547130
感悟
还没写我就想到了,这个模式用来插插件再合适不过了。
装饰者模式
装饰者模式是一种比较常用的模式,其定义如下:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵活。
装饰者模式的应用
优点
装饰类和被装饰类可以独立发展,不会互相耦合。不知道有没有看出来,那张类图里面还藏了另一个设计模式。
换句话说,被装饰类也不用知道装饰类,装饰类是从外部来拓展被装饰类的功能,而装饰类也不用知道自己要去装饰谁。
装饰模式是继承关系的一个替代方案,从上面可以看出来,不管装饰多少层,它还是最原始的那个东西。
装饰模式可以动态的拓展一个实现类的功能,无需多言。
缺点
多层的装饰是比较复杂的,一出现问题,你很难知道是哪一层装饰出问题。
所以尽量减少装饰的数量,降低系统复杂度。
使用场景
- 需要动态拓展一个类的功能,或者给一个类添加附加功能。
- 需要动态的给一个对象增加功能,这些功能可以动态的撤销。
- 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰者模式。
装饰者模式是对继承的有力补充。