装饰模式

一,简介

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

 

二,角色

Component

定义一个对象接口,可以给这些对象动态的添加职责

ConcreteComponent

定义一个对象,可以给这个对象添加一些职责

Decorator

维持一个指向Component对象的指针,并定义一个与Component接口一致的接口

ConcreteDecorator

向组件添加具体的职责

三,举例

控制台打印如下表格,基本的姓名、年龄、学历、性别必须拥有,但是现在想动态的增加其他属性,而又不更改原代码。此处就可以用装饰模式,动态的添加一些额外的职责。

1,类图

2,代码

//定义抽象基类 (Component)
class Table { 
public:
	virtual void putTable() = 0;
};


//定义一个具体对象(ConcreteComponent)
class BaseTable :public Table {
public:
	virtual void putTable() {
		printf("姓名 \r\n");
		printf("性别  \r\n");
		printf("学历 \r\n");
		printf("年龄 \r\n");
		cout << "-------------------------" << endl;
	}
};


//装饰抽象类 Decorator,用外类来扩展 Component的功能
class Decorator :public Table {
public:
	Decorator(Table* concrateTb):m_pTable(concrateTb){}

	virtual void putTable() {
		m_pTable->putTable();
	}
private:
	Table* m_pTable;
};

class  EngDcrt:public Decorator
{

public:
	 EngDcrt(Table* pTb):Decorator(pTb){}
	virtual void putTable(){
		printf("英语等级 \r\n");
		Decorator::putTable();
	}
};

class  Experience :public Decorator
{

public:
	Experience(Table* pTb) :Decorator(pTb) {}
	virtual void putTable() {
		printf("项目经验 \r\n" );
		Decorator::putTable();
	}
};
int main()
{
	cout << "初始表格" << endl << endl;
	BaseTable pro1;
	pro1.putTable();

	//扩展功能
	cout << "新表格1" << endl << endl;
	EngDcrt eng(&pro1);
	eng.putTable();

	//扩展功能
	cout << "新表格2" << endl << endl;
	Experience ex(&eng);
	ex.putTable();
	
	system("pause");
	return 0;
}

四,优缺点

优点:

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

 

缺点:

多层装饰比较复杂

五,使用场景

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。在不想增加很多子类的情况下使用扩展类,如 扩展一个类的功能或者动态增加功能,动态撤销。

如:孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。

注意事项:可代替继承

 

参考:https://www.cnblogs.com/wrbxdj/p/5259742.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值