设计模式之结构模式之装饰模式

[size=large][b]1,UML图[/b][/size]

[img]http://dl.iteye.com/upload/attachment/0071/9474/80af9eb5-5c97-3011-a354-48311f6b2c40.jpg[/img]


[b]抽象构件(Component)角色[/b]:给出一个抽象接口,以规范准备接收附加责任的对象。
[b]具体构件(Concrete Component)角色[/b]:定义一个将要接收附加责任的类。
[b]装饰(Decorator)角色[/b]:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
[b]具体装饰(Concrete Decorator)角色[/b]:负责给构件对象“贴上”附加的责任。

[size=large][b]2, 模式说明[/b][/size]

装饰模式使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。
装饰模式的关键在于这种扩展是完全透明的。装饰模式常常被称做包裹模式,就是
因为每一个具体装饰类都将下一个具体装饰类或者具体构件类包裹起来。

[size=large][b]3,模式示例代码[/b][/size]


package com.maohao.struct.decorator;

public interface Component {

void sampleOperation();
}



package com.maohao.struct.decorator;

public class ConcreteComponent implements Component {

/**
* 构造子
*/
public ConcreteComponent() {
//
}

/**
* 商业方法
*/
@Override
public void sampleOperation() {
//
}
}



package com.maohao.struct.decorator;

public class Decorator implements Component {

private Component component;

/**
* 构造子
*/
public Decorator() {

//
}

/**
* 构造子
*/
public Decorator(Component component) {

this.component = component;
}

@Override
public void sampleOperation() {

component.sampleOperation();
}
}



package com.maohao.struct.decorator;

public class ConcreteDecorator extends Decorator {

/**
* 商业方法
*/
public void sampleOperation() {

super.sampleOperation();
}
}


[size=large][b]4,什么情况下使用[/b][/size]

(1)需要扩展一个类的功能,或给一个类增加附加责任;
(2)需要动态地给一个对象增加功能,这些功能可以再动态地撤销;
(3)需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系
变得不现实。

[size=large][b]5,模式的优缺点 [/b][/size]

优点:(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供
比继承更多的灵活性;
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出
很多不同行为的组合;
(3)这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。

[size=large][b]6,与其他模式比较[/b][/size]

与适配器模式:适配器模式的用意是要改变所考虑的对象的接口而不一定改变对象的性能,而装饰模式的用意是要保持接口,从而增强所考虑对象的性能。

与策略模式:装饰模式将一个东西的表皮换掉,而保持它的内心。策略模式恰好相反,它在保持接口不变的情况下,使具体算法可以互换;装饰模式的实现要求Component尽量地“轻”,而策略模式要求抽象策略类尽量的“重”。

与合成模式:装饰模式常常用在合成模式的行为扩展上。使用继承关系扩展合成模式的行为很困难。如果仅仅对抽象构件(Component)类还是合成类(Composite)类或者树叶(Leaf)类使用继承办法,都会导致多态性被破坏。


[size=large][b]7,模式应用[/b][/size]

Java IO库中大量使用了装饰模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值