学以致用C++设计模式 之 “装饰者模式”

在这里插入图片描述

自动机

为了提高大家的积极性,我们团队购进了一套自动设备。它具体能干嘛呢?
只要你走到特定的位置,它会就给你量体温,给你端咖啡,给你整理着装,给你上班打卡。
当然,这些服务都得是你自选的,你选,或者不选,它都在那里。你选或者不选,别人也都可以来选,它就是一套设备。

当然我这么说可能有的人会想到模板方法模式或者建造者模式,注意啊不一样啊,模板和建造者都是没主体的,或者说,是把多个主体合成一个主体,而你见过你的装饰和你同为主体吗?显然不是。装饰嘛,呼之即来挥之即去,想戴上就戴上,不想戴上摘了就是。

不过,装饰者和建造者还是有那么些共通点的,建造者的材料谁都能用,装饰者也差不多,就拿那个自动机来说,只要你是我们团队的人,你就能用。

今天也不抓主题了,稍微有点累,咱直接画类图。
在这里插入图片描述
不多说,一切看代码,睁大眼睛吧!

代码实现

#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

感悟

还没写我就想到了,这个模式用来插插件再合适不过了。

装饰者模式

装饰者模式是一种比较常用的模式,其定义如下:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵活。

装饰者模式的应用

优点

装饰类和被装饰类可以独立发展,不会互相耦合。不知道有没有看出来,那张类图里面还藏了另一个设计模式。
换句话说,被装饰类也不用知道装饰类,装饰类是从外部来拓展被装饰类的功能,而装饰类也不用知道自己要去装饰谁。

装饰模式是继承关系的一个替代方案,从上面可以看出来,不管装饰多少层,它还是最原始的那个东西。
装饰模式可以动态的拓展一个实现类的功能,无需多言。

缺点

多层的装饰是比较复杂的,一出现问题,你很难知道是哪一层装饰出问题。
所以尽量减少装饰的数量,降低系统复杂度。

使用场景

  • 需要动态拓展一个类的功能,或者给一个类添加附加功能。
  • 需要动态的给一个对象增加功能,这些功能可以动态的撤销。
  • 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰者模式。

装饰者模式是对继承的有力补充。

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/106589616