`
aijuans9
  • 浏览: 12810 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多

【1】基本概念

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

【2】简单分析

          我们先来看下该设计模式的UML结构图

上图是Decorator 模式的结构图,让我们可以进行更方便的描述:

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

ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。

Decorator是装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。

ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。

【3】如何用Java语音来实现该设计模式

假设情景:某人装扮自己形象,穿衣服,裤子,鞋子,戴帽子等来把自己给包装起来,需要把所需的功能按正确的顺序串联起来进行控制,我们应该如何设计才能做到呢?如下,先看下代码结构图:


3.1 先创建一个接口类:Component.java 

package com.andyidea.patterns.component;  
  
public interface Component {  
      
    void show();  
  
}  

 3.2 创建一个具体的 ConcreteComponent 来实现 Component 接口:Person.java

package com.andyidea.patterns.concretecomponent;  
  
import com.andyidea.patterns.component.Component;  
  
public class Person implements Component{  
      
    private String name;  
      
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public Person(String name){  
        this.name = name;  
    }  
  
    @Override  
    public void show() {  
        System.out.println("装扮的" + name);  
    }  
  
}  
3.3 创建装饰类 Decorator 实现 Component 接口
[html] view plaincopy
package com.andyidea.patterns.decorator;  
  
import com.andyidea.patterns.component.Component;  
  
public class Decorator implements Component{  
      
    private Component mComponent;  
      
    public void decoratorObj(Component component){  
        mComponent = component;  
    }  
  
    @Override  
    public void show() {  
          
        if(mComponent != null){  
            mComponent.show();  
        }  
    }  
  
}  
3.4 分别创建具体的装饰类:Jeans.java , Pelisse.java, Sandal.java ...等等,分别继承 Decorator.java 类:
[html] view plaincopy
package com.andyidea.patterns.concretedecorator;  
  
import com.andyidea.patterns.decorator.Decorator;  
  
/** 牛仔裤 */  
public class Jeans extends Decorator {  
  
    @Override  
    public void show(){  
        System.out.println("穿牛仔裤");  
        super.show();  
    }  
      
}  
其余类类似,在这里就省略了。
3.5 客户端测试类:
[html] view plaincopy
package com.andyidea.patterns;  
  
import com.andyidea.patterns.concretecomponent.Person;  
import com.andyidea.patterns.concretedecorator.Jeans;  
import com.andyidea.patterns.concretedecorator.Sandal;  
import com.andyidea.patterns.concretedecorator.TShirt;  
  
/**  
 * 装饰模式测试客户端  
 * @author Andy.Chen  
 *  
 */  
public class DecoratorClient {  
  
    public static void main(String[] args) {  
        System.out.println("Welcome to Andy.Chen Blog!" +"\n"   
                   +"Decorator Patterns." +"\n");  
          
        Person mPerson = new Person("Andy");  
          
        Sandal mSandal = new Sandal();  
        Jeans mJeans = new Jeans();  
        TShirt mShirt = new TShirt();  
          
        mShirt.decoratorObj(mPerson);  
        mJeans.decoratorObj(mShirt);  
        mSandal.decoratorObj(mJeans);  
        mSandal.show();  
          
    }  
      
}  
【4】测试显示输出的结果如下:
[html] view plaincopy
Welcome to Andy.Chen Blog!  
Decorator Patterns.  
  
穿凉鞋  
穿牛仔裤  
穿T-Shirt  
装扮的Andy  
 【5】总结:Decorator模式有以下的优缺点:

 

1.比静态继承更灵活与对象的静态继承相比,Decorator模式提供了更加灵活的向对象添加职责的方式,可以使用添加和分离的方法,用装饰在运行时刻增加和删除职责。使用继承机制增加职责需要创建一个新的子类,如果需要为原来所有的子类都添加功能的话,每个子类都需要重写,增加系统的复杂度,此外可以为一个特定的Component类提供多个Decorator,这种混合匹配是适用继承很难做到的。
2.避免在层次结构高层的类有太多的特征,Decorator模式提供了一种“即用即付”的方法来添加职责,他并不试图在一个复杂的可订制的类中支持所有可预见的特征,相反可以定义一个简单的类,并且用Decorator类给他逐渐的添加功能,可以从简单的部件组合出复杂的功能。
3.Decorator 与它的Component不一样 Decorator是一个透明的包装,如果我们从对象标识的观点出发,一个被装饰了的组件与这个组件是有差别的,因此使用装饰时不应该以来对象标识。
4.产生许多小对象,采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同。

 

分享到:
评论

相关推荐

    Java设计模式之-Decorator装饰模式

    Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)

    装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为或职责,同时保持对象的接口不变。这种模式使得我们可以在不修改原有代码的基础上,通过组合不同的装饰来扩展对象的功能,实现了代码的高可...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...装饰模式(Decorator Pattern)、迭代器模式(Iterator Pattern)、组合模式(Composite Pattern)、观察者模式(Observer Pattern)、责任链...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象添加新的责任或功能,而不必通过子类化的方式。在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程...

    设计模式---装饰者模式

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码或创建子类。这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    装饰模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式通常用于保持对象的原始类结构不变,同时增强其功能。HeadFirst 设计模式系列书籍以其生动有趣的插图和...

    26种设计模式-----pdf

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种设计模式",其中可能详细介绍了软件开发中的26个核心设计模式。这些模式是经过时间检验、被广泛接受并反复使用...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类,该类包装了原始类的实例,并在调用原始类方法之前或之后添加额外的...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象编程中最核心的设计原则之一。这些模式可以帮助开发者解决常见的编程问题,并提高代码的可复用性和可维护性。 #### 创建型模式 创建型模式关注的是对象...

    设计模式PPT---25种设计模式详解

    4. 装饰模式(Decorator):动态地给对象添加新的职责。 5. 外观模式(Facade):为子系统提供一个统一的接口,简化了客户端与其交互。 6. 享元模式(Flyweight):为了减少大量相似对象的创建,共享内存中的对象。 ...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    23种设计模式--装饰模式

    装饰模式是一种结构型设计模式,它是面向对象设计中用来动态添加或修改对象功能的一种方法。在软件工程中,装饰模式允许我们向一个现有的对象添加新的行为或职责,同时又不改变其原有的结构,从而实现对类的功能扩展...

    23种 设计模式---面向对象的基本原则

    - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,提供比继承更灵活的功能扩展。 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility):避免将处理请求的发送者和...

Global site tag (gtag.js) - Google Analytics