您的位置:首页 > 其它

大话设计模式-Study-Tips-第三章-装饰模式

2017-07-29 15:41 447 查看

一、UML图



二、包含的角色

(1)Component是一个对象接口,可以给对象动态的添加职责

(2)ConcreteComponent  定义了一个具体的类,可以给这个类添加一些职责

(3)Decorater 为装饰的抽象类,继承了Component,从外类来扩展Component的功能,但对于Component来说。是无需知道Decorater的存在的

(4)ConcreteDecorater为装饰的具体类,起到给Component添加职责的功能。

三、特点

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

(1)装饰模式是为已有功能动态的添加更多功能的一种方式

(2)当系统需要新功能的时候,是向旧的类中添加新的代码,这些代码通常装饰了原有类的核心职责或主要行为。在主类中加入新的字段,新的方法和新逻辑,增加了主类的复杂度,但是这些新加入的东西仅仅是为了满足 一些只在某种特定 情况下才会执行的特殊行为的需求。而装饰模式提供了一种好的解决方案,把每个需要装饰的功能封装在单独的类中,并让这个类去包装它所要装饰的对象,因此,执行特殊行为时候,客户代码就可以在运行时根据需要,选择的,按顺序的使用装饰功能包装对象。

优点:把类的装饰功能从类中搬走,降低了主类的复杂度,有效的将类的核心功能和修饰功能分离,而且可以去除相关类中重复的修饰逻辑。

使用场合:

(1)需要在内部组装完成显示出来的情况。

(2)装饰模式的建造过程不稳定。

(3)我们需要把所需的功能按正确的顺序串联起来进行控制。

四、代码实现

C# 实现

Component类

public abstract class Component {
public abstract void Operation();
}
ConcreteComponent  类
public class ConcreteComponent : Component
{
public override void Operation()
{
Console.WriteLine("具体对象的操作");
}
}
Decorater 类

public abstract class Decorater : Component
{
protected Component component;
public override void Operation()
{
if (component!=null)
{
component.Operation();
}
}

public void SetComponent(Component component)
{
this.component = component;
}
}
ConcreteDecorater类 这里只写一个。其他的同理
public class ConcreteDecoraterA : Decorater
{
private int Attribute ;
public override void Operation()
{
base.Operation();
Attribute = 111;
}
}
调用方式:
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoraterA d1 = new ConcreteDecoraterA();
ConcreteDecoraterB d2 = new ConcreteDecoraterB();
d1.SetComponent(c);
d2.SetComponent(d1);
d2.Operation();

Console.WriteLine("Hello World!");
}


C++实现

Component类

class Component
{
public:
virtual void Operation() = 0;
};
ConcreteComponent类

class ConcreteComponent : public Component
{
public:
void Operation();
};

Dectorater类

Dectorater.h

#include "Component.h"

class Decorater : public Component
{
private:
Component* _component;
public:
void Operation();
void SetComponent(Component* component);
};
Dectorater.cpp
#include "Decorater.h"

void Decorater::Operation()
{
if (_component!=NULL)
{
_component->Operation();
}
}

void Decorater::SetComponent(Component * component)
{
_component = component;
}

ConcreteDecorater类

#include "Decorater.h"

class ConcreteDecoraterA : public Decorater
{
public:
void Operation();
private:
int Attribute;
};

void ConcreteDecoraterA::Operation()
{
Decorater::Operation();
printf("2");
}


调用方式
#include "ConcreteComponent.h"
#include "ConcreteDecoraterA.h"
#include "ConcreteDecoraterB.h"

int main()
{
ConcreteComponent* cC = new ConcreteComponent();
ConcreteDecoraterA* cDa = new ConcreteDecoraterA();
ConcreteDecoraterB* cDb = new ConcreteDecoraterB();

cDa->SetComponent(cC);
cDb->SetComponent(cDa);
cDb->Operation();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: