装饰器模式

本文介绍了装饰器模式的概念、原理及应用场景。装饰器模式允许在不修改原有类的情况下为其添加新功能,通过组合多个装饰器可以灵活扩展对象的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六. 装饰器模式
整理自 《java与模式》阎宏编著


1.意图:

在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。

2.类图:
[img]http://eneasy.iteye.com/upload/picture/pic/10049/e761e0ca-74e6-3a1d-b298-73012301a99a.jpg[/img]

3.原理:
在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。以对客户端透明的方式扩展对象的功能。
装饰器模式又称为包裹模式(wrapper),因为一个具体装饰器都将下一个具体装饰器或具体构件类包裹起来。如有三个装饰器类Decorator1, Decorator2, Decorator3,它们的典型的创建过程为new Decorator1(new Decorator2(new Decorator3(new ConcreteComponent()))).

这样Decorator1包裹了Decorator2,Decorator2包裹了Decorator3,Decorator3包裹了ConcreteComponent对象,每一层包裹都提供了新的功能。如图:
[img]http://eneasy.iteye.com/upload/picture/pic/10051/622f76c6-914b-387b-94ad-75372d361d2e.jpg[/img]

4.特征:

装饰器角色持有一个构件对象的实例,并实现了抽象构件的接口。每一个接口的实现都是委派给所持有的构件对象,并增加新的功能。
5.说明:

优点:

装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是“粘上”还是“去掉”一个装饰。
通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。

缺点:

装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。



模式的简化:
简化必须注意两点:

a.一个装饰器类的接口必须与被装饰的类的接口相容。

b.尽量保持Component作为一个“轻”类。

Component类的职责在于为各个具体装饰器类提供共同的接口,而不是存储数据,所以不要把太多的逻辑和状态放在Component类里面。

省略Component接口,只有一个具体的ConcreteComponent类,则Decorater经常作为ConcreteComponent的子类。如图:

[img]http://eneasy.iteye.com/upload/picture/pic/10053/265fbcdb-759e-3586-ab6d-fb4e962e32e2.jpg[/img]


省略Decorator类,如果只有一个具体的ConcreteDecorator类,那可以省略Decorator,将ConcreteDecorator和Decorator角色的职责合并在一起。如图:
[img]http://eneasy.iteye.com/upload/picture/pic/10055/3951112a-131e-33c8-8840-4c6af257fe33.jpg[/img]

6.使用案例:

7.代码:



// Component.java 构件类

public abstract class Component

{

public abstract void doSomething();

}



// ConcreteComponent.java 具体构件类

public class ConcreteComponent extends Component

{

public void doSomething()

{

// provide implementation here

}

}

/ / Decorator.java 装饰器抽象类
public abstract class Decorator extends Component

{

protected Component component;



public Decorator(Component component)

{

this.component = component;

}



public void doSomething()

{

component.doSomething();

}

}

// ConcreteDecorator.java 具体装饰器类

public class ConcreteDecorator extends Decorator

{



public ConcreteDecorator(Component component)

{

super(component);

}



private void addedBehavior()

{

// some extra functionality goes here

}



public void doSomething()

{

component.doSomething();

addedBehavior();

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值