作者:卫通达邱小洁GPS | 来源:互联网 | 2023-09-15 11:52
1、UML类图2、UML类图详解装饰模式的结构主要有四个元素:--抽象组件:Component--具体组件:ConcreteComponent--抽象装饰组件
1、UML类图
![](https://www.#.com/go/aHR0cDovL3BpY3R1cmUuamVsbHl0aGluay5jb20vamVsbHl0aGlua0RlY29yYXRvckNsYXNzLnBuZw==)
2、UML类图详解
装饰模式的结构主要有四个元素:
--抽象组件:Component
--具体组件:ConcreteComponent
--抽象装饰组件:Decorator
--具体装饰组件:ConcreteDecorator
装饰模式的三个主要特点为:
--具体组件和装饰组件都继承于抽象组件
--装饰组件有抽象组件的指针或引用(Component*)
--使用装饰组件和具体组件可以创造出新的类
3、使用场合
为已有功能动态添加更多功能的一种方式,当加入的新功能仅仅是为了满足一些只在某种特定情况才会执行的特殊行为的需要,但在原类中加入新代码会增加原类的复杂度。装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所需要修饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用修饰功能包装对象。有效地把类的核心职责和装饰功能分开了,而且可以去除类中重复的装饰逻辑。
用形象话的语言理解装饰模式就是把抽象组件看成一个人类,具体组件可以是小明,现在我想为小明穿上衬衣,西服,皮鞋,领带...可扩展的类,但是核心的人类保持不变,体现了依赖倒置原则--即对内“封闭”,对外“开放”。装饰模式一般用在核心功能保持不变但是装饰功能可以动态的增加或者选择性地调用。以下示例程序的执行结构如图:
![](https://www.#.com/go/)
![](https://www.#.com/go/)
![](https://www.#.com/go/)
4、C+代码实现![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcwNDAxMTQ0NTI2MzQ0P3dhdGVybWFyay8yL3RleHQvYUhSMGNEb3ZMMkpzYjJjdVkzTmtiaTV1WlhRdmQybHVaMWREL2ZvbnQvNWE2TDVMMlQvZm9udHNpemUvNDAwL2ZpbGwvSTBKQlFrRkNNQT09L2Rpc3NvbHZlLzcwL2dyYXZpdHkvQ2VudGVy)
#include
#include
using namespace std;
//根据UML类图创建的装饰模式的类
class Component {
public:
virtual void operation() = 0;
};
class ConcreteComponent :public Component {
public:
virtual void operation()
{
cout <<"I'm no decorator ConcreteComponent" < }
};
class Decorator :public Component {
public:
Decorator(Component* pComponent) :m_pComponent(pComponent) {}
virtual void operation()
{
if (m_pComponent != NULL)
m_pComponent->operation();
}
protected:
Component* m_pComponent;
};
class ConcreteDecoratorA :public Decorator {
public:
ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator) {}
virtual void operation()
{
Addoperation();
Decorator::operation();
}
void Addoperation()
{
cout <<"I'm add operationA" < }
};
class ConcreteDecoratorB :public Decorator {
public:
ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator) {}
virtual void operation()
{
Addoperation();
Decorator::operation();
}
void Addoperation()
{
cout <<"I'm add operationB" < }
};
//主程序
int main()
{
Component *pCompOnentObj= new ConcreteComponent();
Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
pDecoratorAOjb->operation();
cout <<"=============================================" < Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
pDecoratorBOjb->operation();
cout <<"=============================================" < Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
pDecoratorBAOjb->operation();
cout <<"=============================================" < delete pDecoratorBAOjb;
pDecoratorBAOjb = NULL;
delete pDecoratorBOjb;
pDecoratorBOjb = NULL;
delete pDecoratorAOjb;
pDecoratorAOjb = NULL;
delete pComponentObj;
pCompOnentObj= NULL;
system("pause");
return 0;
}