装饰模式

使用

当我们需要在一个类中增加一定的功能时候,常常想到增加子类扩展功能,但如果需要给5个同级类增加相同的功能,就需要写5个子类。而在基类上进行修改增加功能不但混淆了核心功能更违背了开闭原则,这时候就需要使用装饰模式

概念

动态的给一些对象增添一些职责,就增加功能来说,装饰模式比增加子类更灵活。它把每个要装饰的功能放在单独的类中,并让这个类包装所要装饰的对象,当需要执行特殊行为时候,客户代码就可以根据运行情况有选择灵活地包装对象。

优点

1 动态扩展,而不需要是把装饰功能从类中移除,就可以还原原有的类
2 有效的把类的核心职责和装饰的职责区分开。
3 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能

UML

在这里插入图片描述

代码

#include<iostream>
using namespace std;
//抽象接口
class Component
{
public:
	Component() {};
	~Component() {};
	virtual void Operation() {};
private:
};
//添加装饰的对象实例
class ConcreatComponent :public Component
{
public:
	ConcreatComponent() {};
	~ConcreatComponent() {};
	void Operation() { cout << "核心职责" << endl; };
private:
};
//装饰抽象类
class Decorator :public Component
{
public:
	Component *component;
	Decorator() {};
	~Decorator() {};
	void setComponent(Component* c) { component = c; };
	void Operation() { component->Operation(); };
private:
};

//装饰对象A
class ConcreatDecoratorA :public Decorator
{
public:
	ConcreatDecoratorA() {};
	~ConcreatDecoratorA() {};
	void Operation() { Decorator::Operation(); cout << "添加A功能" << endl;}
private:
};

//装饰对象B
class ConcreatDecoratorB :public Decorator
{
public:
	ConcreatDecoratorB() {};
	~ConcreatDecoratorB() {};
	void Operation() {  Decorator::Operation();  cout << "添加B功能" << endl;}
private:
};

int main()
{
	ConcreatComponent *component = new ConcreatComponent();
	ConcreatDecoratorA *A = new ConcreatDecoratorA();
	ConcreatDecoratorB *B = new ConcreatDecoratorB();
	A->setComponent(component);
	B->setComponent(A);
	B->Operation();

	getchar();
    //结果
    //核心职责
    //添加A功能
    //添加B功能
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工农村贴膜小哥

我倒是要看看是那个憨憨在给我打

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

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

打赏作者

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

抵扣说明:

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

余额充值