设计模式——装饰者模式

1.装饰者模式是在不必改变原类文件和使用继承关系的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

2.装饰模式的特点:

1)      装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。

2)      装饰对象包含一个真实对象的引用

3)      装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象

4)      装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。

3.设计原则:

1)  多用组合,少用继承:利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态的进行扩展

2)  遵守开闭原则。

4.适用性:

1)  需要扩展一个类的功能,或者给一个类添加附加职责。

2)  需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3)  需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

4)  当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈现爆炸式增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

5.优点:

1)  装饰者模式将各个功能独立出来,以组件的形式修饰一个对象,使得它比传统的继承更加灵活。

2)  通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同的行为组合。

6.缺点:

1)  这种比继承更加灵活的特性,也同时意味着更加多的复杂性。

2)  装饰者模式会导致设计中产生许多小类(组件类),如果过度使用,会使程序变得很复杂。

3)  装饰者是针对抽象组件类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否适合。当然也可以改变Component接口,增加新的公开行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

7.装饰者模式角色:

1)  抽象组件角色:给出一个抽象接口,以规范准备接收附加责任的对象。

2)  具体组件角色:定义一个将要接收附加责任的类。

3)  装饰者抉择:持有一个组件对象实例,并实现一个与抽象构件接口一致的接口

4)  具体装饰者角色:负责将组件添加上附加责任

8.要点:

1)  装饰者和被装饰对象有相同的超类型

2)  可以用一个或多个装饰者包装一个对象

3)  装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

4)  对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象

5)  装饰者模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

6)  装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”的装饰者。

7)  适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰者模式用意是保留增加对象的职责。

9.装饰者模式结构图:

注意:以上实体组件,装饰者可以有好多。

代码示例:

Component:

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

public interface Component

{

void operation();

}

Concrete Component:

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

public class ConcreteComponent implements Component

{

public voidoperation()

{

// Writeyour code here

}

}

Decorator:

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

public class Decorator implements Component

{

publicDecorator(Component component)

{

this.component= component;

}

public voidoperation()

{

component.operation();

}

private Componentcomponent;

}

Concrete Decorator:

在Concrete Component的行为之前或之后,加上自己的行为,以“贴上”附加的职责。

public class ConcreteDecorator extends Decorator

{

public voidoperation()

{

//addBehavior也可以在前面

super.operation();

addBehavior();

}

private voidaddBehavior()

{

//your code

}

}

10.模型简化:

1)  如果只有一个实体组件类,而没有抽象组件接口类时,可以让装饰者继承实体组件类

2)  如果只有一个实体装饰者类时,可以将装饰者和实体装饰者合并。

11.一个实际用例:

现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。

汉堡基类:

packagedecorator;

publicabstract class Humburger {

protected String name ;

public String getName(){

return name;

}

public abstract double getPrice();

}

鸡腿堡类:

packagedecorator;

publicclass ChickenBurger extends Humburger {

public ChickenBurger(){

name = "鸡腿堡";

}

@Override

public double getPrice() {

return 10;

}

}

配料的基类

packagedecorator;

public abstractclass Condiment extends Humburger {

public abstract String getName();

}

生菜:

packagedecorator;

public classLettuce extends Condiment {

Humburger humburger;

public Lettuce(Humburger humburger){

this.humburger = humburger;

}

@Override

public String getName() {

returnhumburger.getName()+" 加生菜";

}

@Override

public double getPrice() {

returnhumburger.getPrice()+1.5;

}

}

辣椒:

packagedecorator;

public classLettuce extends Condiment {

Humburger humburger;

public Lettuce(Humburger humburger){

this.humburger = humburger;

}

@Override

public String getName() {

return humburger.getName()+"加生菜";

}

@Override

public double getPrice() {

returnhumburger.getPrice()+1.5;

}

}

测试:

packagedecorator;

public classLettuce extends Condiment {

Humburger humburger;

public Lettuce(Humburger humburger){

this.humburger = humburger;

}

@Override

public String getName() {

returnhumburger.getName()+" 加生菜";

}

@Override

public double getPrice() {

returnhumburger.getPrice()+1.5;

}

}

参考文献:

http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html

http://baike.baidu.com/view/2787758.htm?fr=aladdin

http://blog.csdn.net/lansuiyun/article/details/11714957

时间: 2024-10-22 21:10:26

设计模式——装饰者模式的相关文章

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

5分钟读书笔记之 - 设计模式 - 装饰者模式

本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者模式对象是一种更灵活的选择. 装饰者可用于为对象增加功能.它可以用来替代大量子类. 考虑前面的自行车类,你现在可能提供一些配件供用户选择,装饰者模式要求我们只需要创建选件类,这些类与四种自行车类都要实现Bicycle接口,但是他们只被用作这些自行车类的包装类.在这个例子

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor

java设计模式-装饰者模式

定义: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 概述: 1.装饰者和被装饰对象有相同的超类型. 2.你可以用一个或多个装饰者包装一个对象. 3.既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合 ,可以用装饰过的对象代替它. 4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的. 5.对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者