装饰者模式

来源:互联网 发布:linux 端口转发到外部 编辑:程序博客网 时间:2024/06/05 19:03

我们都知道,可以使用两种方式给一个类或者对象添加行为。

        一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时

还可以拥有父类的方法。但是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为

的方式和时机。

        二是使用关联。组合即将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为。

这是一种动态的方式,我们可以在应用程序中动态的控制。

        与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,可以使系统更加容易维护。但

是它的缺点就在于要创建比继承更多的对象。

一、定义:

装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更具有弹性的替代方案。

二、UML类图:

、代码演示:

情景是这样的:星巴兹以扩张速度快而闻名。在里面购买咖啡时,可以要求在其中加入各种调料,星巴兹会根据

所加入的调料收取不同的费用,也就是说不同的咖啡与调料之间有N多不同的组合方式。每种咖啡和调料都有不同的

收费。如果这个时候我们使用继承方式,则会陷入无以复加的地步。这里会有N多个类,出现“类爆炸”现象。

Beverage.java(抽象组件):


Espresso.java(具体组件):


HouseBlend.java(具体组件):

MoCha.java(具体装饰者)


Whip.java(具体装饰者)


Test.java(测试类):


输出结果


四、优缺点:

优点

1、装饰者模式可以提供比继承更多的灵活性

2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。

3、通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具

体装饰类来装饰同一对象,得到功能更为强大的对象。

4、具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再

对其进行组合,原有代码无须改变,符合“开闭原则”。

缺点

1、会产生很多的小对象,增加了系统的复杂性

2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装

饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

五、总结:

1、 组合和委托可以在运行时动态的添加新的行为,而继承是静态的,在系统编译时就已经决定了对象的行为。

2、装饰者模式意味着一群装饰者类,这些类用来包装具体组件

3、装饰者可以在被装饰者的行为前面或者后面加上自己的行为,甚至可以将被装饰者的行为整个取代掉,从而

达到特定的目的。

4、可以用多个装饰者包装一个组件。

5、装饰者一般对于组件的客户是透明的,除非客户程序依赖于组件的具体类型。

6、装饰者会导致设计中出现许多的小对象,如果过度的使用,会让系统变得更加复杂。

7、装饰者和被装饰者对象有相同的超类型。

原创粉丝点击