设计模式 笔记 装饰模式 Decorator

//---------------------------15/04/17----------------------------

//Decorator 装饰模式----对象结构型模式

/*

1:意图:

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

2:别名:

包装器(Wrapper)

3:动机:

4:适用性:

1>在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2>处理那些可以撤销的职责。

3>当不能采用生成子类的方法进行扩充时:

1)可能有大量独立的扩展,为支持每一种组合将产生大量的子类。

2)类定义被隐藏,或类定义不能用于生成子类。

5:结构:

Component:<------------------

Operation                   |

|                       |

|                       |

------------------              |

|                |              |

ConcreteComponent:      Decorator:      |

Operation()             component--------

Operation()

{ component->Operation() }

|

|

--------------------

|                  |

ConcreteDecoratorA: ConcreteDecoratorB:

Operation()         Operatione()

addedState()        {   Decorator::Operation();

AddedBehavior();        }

AddedBehavior()

6:参与者:

1>Component

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

2>ConcreteComponent

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

3>Decorator

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

4>ConcreteDecorator

向组件添加职责。

7:协作:

Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

8:效果:

1>优点:

1)比静态继承更灵活。

Decorator模式提供了更加灵活的向对象添加职责的方式,在运行时刻添加和删除职责。

相比于使用继承,Decorator模式可以很容易地重复添加一个特性,而重复继承很容易出错。

2)避免在层次结构高层的类有太多特征。

Decorator模式提供了一种“即用即付”的方法来添加职责。可以对一个简单的类扩展出复杂的

功能。

2>缺点:

1)Decorator和它的Component不一样。

被装饰了的组件和没装饰时是有差别的,因此,使用装饰时不应该依赖对象标识。

装饰后,在别的对象看来,就是Decorator类了,而不是ConcreteCompnent类了

2)有许多小对象。

采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互

连接的方式上有所不同,而不是它们的类或是他们的属性值有所不同。所以这些系统很难学习和排错。

9:实现:

1>接口的一致性:

装饰对象的接口必须与它所装饰的Component的接口是一致的,因此所有的ConcreteDecorator类必须

有一个公共的父类。

2>省略抽象的Decorator类:

当你仅需要添加一个职责时,没有必要定义抽象的Decorator类。

3>保持Component类的简单性:

为了接口的一致性,组件和装饰都必须继承自Component类,所以保持这个类的简单性很重要。

也就是把这个类设计目的集中于接口设计,而不是存储数据。

4>改变对象外壳与改变对象内核:

可以把Decorator类当作是一个对象的外壳,添加Decorator类可以改变一个对象的行为,但是当

Component类很庞大时,添加一个Decorator类代价就显得很大。所以可以选择使用另外一种模式:

Strategy模式,组件可以将一些行为转发给一个独立的策略对象,通过改变策略对象,就可以达到

改变或扩充组件的功能。

10:代码示例:                                                                            */

//Component类,提供了接口

class VisualComponent

{

public:

VisualComponent();

virtual
void Draw();

virtual
void Resize();

...

};

//abstract Decorator类

class Decorator :public VisualComponent

{

public:

Decorator(VisualComponent*);

virtual
void Draw();

virtual
void Resize();

...

private:

VisualComponent* _component;

};

void Decorator::Draw()

{

_component->Draw();

}

void Decorator::Resize()

{

_component->Resize();

}

//ConcreteDecorator类
在自己的Draw()中添加了要添加的职责--绘制边框

class BorderDecorator :public Decorator

{

public:

BorderDecorator(VisualComponent*,int borderWidth);

virtual
void Draw();

private:

void DrawBorder(int);

private:

int _width;

};

void BorderDecorator::Draw()

{

Decorator::Draw();

DrawBorder(_width);

}

//这里的SetContents以一个Component指针为参数,来进行一些操作,

//通过装饰就可以传入一个装饰过的类

void Window::SetContents(VisualComponent* contents)

{

...

}

Window* window =new Window;

//未经装饰的类,TextView是继承自Component类的ConcreteComponent类

TextView* textView =new TextView;

//它可以被这样传入

window->SetContents(textView);

//也可以通过装饰来传入,这样装饰就增加了起码两个Component大小的内存了,所以

//如果Compnent如果很庞大的话,使用代价会很高。

window->SetContents(new BorderDecorator(new ScrollDecorator(textView),1));

//再考虑一个问题,如果深度很深的话,实现起来效率也会下降。

//何谓深度,就是装饰了很多很多次,这里的调用其实就是通过指针不断访问下一个对象调用Draw(),就和链表一样,

//如果深度很深,那么就像遍历链表一样。

//这时可以考虑实现中最后一点说的,使用strategy模式。

时间: 2024-08-01 09:08:25

设计模式 笔记 装饰模式 Decorator的相关文章

设计模式笔记——装饰模式

装饰模式 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1.装饰模式的特点 (1)装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2)装饰对象包含一个真实对象的引用(reference) (3)装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4)装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功

大话设计模式笔记 装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. package decoratePattern; public abstract class Component { public abstract void Operation(); } package decoratePattern; public class ConcreteComponent extends Component { @Override public void

【设计模式】—— 装饰模式Decorator

前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下,为对象动态的添加某些操作. 2 处理一些可以撤销的职责. 3 当不能使用生成子类来扩充时. 模式结构 Component 外部接口,用于定义外部调用的形式.提供默认的处理方法. interface Component{ public void operation(); } ConcreteComp

设计模式之装饰模式 Decorator

代码实现 public interface ICar { void move(); } 抽象构建角色 //具体构件角色(真实对象,被装饰角色) class Car implements ICar{ @Override public void move() { System.out.println("陆地上跑"); } } 具体构建角色 //装饰角色 class SuperCar implements ICar{ private ICar car; public SuperCar(ICa

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

设计模式--装饰模式(Decorator)

装饰模式(Decorator) : 动态的给一个对象加入一些额外的职能,就添加功能来说,装饰模式比生成子类更为灵活. 实例: ConcreteComponent:让Decorator对象为自己加入功能.有时候使用ConcreteComponent的派生类提供核心功能.在这样的情况就是用ConcreteComponent替代了Component的功能,并且装饰者是继承于ConcreteComponent的子类. Component:定义ConcreteComponent和Decorator类要实现

[设计模式] .NET设计模式笔记 - 有多少种设计模式

.NET下的23中设计模式. ※创建型模式篇 ●单件模式(Single Pattern) ●抽象工厂模式(Abstract Factory) ●建造者模式(Builder Pattern) ●工厂方法(Factory Method) ●原型模式(Protype Pattern) ※结构型模式篇 ●适配器模式(Adapter Pattern) ●桥接模式(Bridge Pattern) ●装饰模式(Decorator Pattern) ●组合模式(Composite Pattern) ●外观模式(

Asp.net设计模式笔记之一:理解设计模式

GOF设计模式著作中的23种设计模式可以分成三组:创建型(Creational),结构型(Structural),行为型(Behavioral).下面来做详细的剖析. 创建型 创建型模式处理对象构造和引用.他们将对象实例的实例化责任从客户代码中抽象出来,从而让代码保持松散耦合,将创建复杂对象的责任放在一个地方,这遵循了单一责任原则和分离关注点原则. 下面是“创建型”分组中的模式: 1.Abstract Factory(抽象工厂)模式:提供一个接口来创建一组相关的对象. 2.Factory Met

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************