`
zhangwei_david
  • 浏览: 480383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-装饰器模式(Decorator)

阅读更多

    装饰器模式(Decorator Pattern)又名包装模式(Wrapper Pattern)。装饰模式以对客户透明的方式扩展对象的功能,是继承关系的一种替代。换言之,客户端不会觉得对象在装饰前和装饰后有什么不同。

     装饰器模式(Decorator Pattern)中的各个角色:

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

什么情况下需要使用装饰器模式:

  1. 需要扩展一个类的功能,或给一个类增加附加的责任
  2. 需要动态地给一个对象增加更能,这些功能可以动态地删除
  3. 需要增加一些基本功能的排列组合而产生非常大的功能,从而是关系继承变的不现实。

 

/**
 * 抽象构件
 * @author zhangwei_david
 * @version $Id: Animal.java, v 0.1 2014年10月20日 下午10:13:25 zhangwei_david Exp $
 */
public interface Animal {
    public void doStuff();
}

/**
 *具体构件
 * @author zhangwei_david
 * @version $Id: Rat.java, v 0.1 2014年10月20日 下午10:14:21 zhangwei_david Exp $
 */
public class Rat implements Animal {

    /**
     * @see com.cathy.demo.pattern.composite.reflect.Animal#doStuff()
     */
    public void doStuff() {
        System.out.println("Jerry will play with Tom.");
    }

}

/**
 *抽象装饰器角色
 * @author zhangwei_david
 * @version $Id: Feature.java, v 0.1 2014年10月20日 下午10:14:59 zhangwei_david Exp $
 */
public interface Feature {

    public void load();
}

/**
 *具体装饰器角色
 * @author zhangwei_david
 * @version $Id: FlyFeature.java, v 0.1 2014年10月20日 下午10:16:20 zhangwei_david Exp $
 */
public class FlyFeature implements Feature {

    /**
     * @see com.cathy.demo.pattern.composite.reflect.Feature#load()
     */
    public void load() {
        System.out.println("增加翅膀。。。。");
    }

}

/**
 *具体装饰器角色
 * @author zhangwei_david
 * @version $Id: DigFeature.java, v 0.1 2014年10月20日 下午10:17:13 zhangwei_david Exp $
 */
public class DigFeature implements Feature {

    /**
     * @see com.cathy.demo.pattern.composite.reflect.Feature#load()
     */
    public void load() {
        System.out.println("增加钻地能力。。。");
    }

}
/**
 *装饰器反射实现类
 * @author zhangwei_david
 * @version $Id: DecorateAnimal.java, v 0.1 2014年10月20日 下午10:18:06 zhangwei_david Exp $
 */
public class DecorateAnimal implements Animal {
    private Animal                   animal;

    private Class<? extends Feature> clz;

    /**
     * @see com.cathy.demo.pattern.composite.reflect.Animal#doStuff()
     */
    public void doStuff() {
        InvocationHandler handler = new InvocationHandler() {

            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object obj = null;
                if (Modifier.isPublic(method.getModifiers())) {
                    obj = method.invoke(clz.newInstance(), args);
                }
                animal.doStuff();
                return obj;
            }
        };
        ClassLoader cl = getClass().getClassLoader();
        Feature proxy = (Feature) Proxy.newProxyInstance(cl, clz.getInterfaces(), handler);
        proxy.load();

    }

    public DecorateAnimal(Animal animal, Class<? extends Feature> clz) {
        super();
        this.animal = animal;
        this.clz = clz;
    }

}
/**
 *
 * @author zhangwei_david
 * @version $Id: TestClient.java, v 0.1 2014年10月20日 下午10:23:34 zhangwei_david Exp $
 */
public class TestClient {

    public static void main(String[] args) {
        Animal jerry = new Rat();
        jerry = new DecorateAnimal(jerry, FlyFeature.class);
        jerry = new DecorateAnimal(jerry, DigFeature.class);
        jerry.doStuff();
    }
}

 结果是:

增加钻地能力。。。
增加翅膀。。。。
Jerry will play with Tom.

 

 

装饰器(Decorator)模式的优缺点:

  1. 装饰器模式(decorator Pattern)与继承关系的目的都是扩展对象的功能,但是装饰器模式可以提供比继承更多的灵活性。装饰器(Decorator)允许系统动态地决定贴上一个需要的装饰,或者除掉一个不必要的装饰。而继承关系则不同,继承关系是静态的,他在系统运行前就已经决定了。
  2. 通过使用不同的装饰器以及这些装饰器的排列组合,设计师可以创造出很多不同的行为的组合。
  3. 比继承更灵活也意味着笔比继承更容易出错。由于使用装饰器模式,可以比继承关系需更少的类。使用较少的类,当然使设计容易进行。但是,使用装饰器会比继承产生更多的对象。更多的对象会使得差错变得困难。
分享到:
评论

相关推荐

    java常用设计模式-装饰器模式

    装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或删除对象的功能时,或者当您想...

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

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    JAVA设计模式-chm版

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)和代理模式(Proxy)。这些模式可以帮助我们更好地组织代码,实现...

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

    1. **组件(Component)**:定义了对象的接口,也就是所有被装饰对象和装饰器对象必须共同遵循的公共行为。这个接口使得装饰者和被装饰的对象可以互换,实现了无缝对接。 2. **具体组件(Concrete Component)**:...

    JAVA设计模式---100%推荐

    结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)和桥接(Bridge)模式。行为型模式则关注对象之间的通信和职责分配,如观察者(Observer)、模板方法...

    JAVA设计模式--入门

    **Java设计模式——入门** 设计模式是软件开发中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。Java设计模式是面向对象编程中的一个重要概念,可以帮助开发者编写可复用、可维护、易于理解的代码。这...

    9.设计模式-装饰器模式1

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它的核心思想是在不修改原有对象的前提下,通过包装(包裹)原对象并扩展其行为来增加功能。这种模式常用于在运行时动态地给对象添加新的职责,使得系统具有...

    JAVA设计模式学习12——装饰器模式

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

    java-io-decorator.pdf

    Java I/O装饰器模式是Java I/O库中实现的一种设计模式,用于动态地给一个对象添加额外的职责。装饰器模式在GoF(Gang of Four)的《设计模式:可复用面向对象软件的基础》一书中被提出,并且广泛应用于多种编程语言中...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    JAVA design pattern-java设计模式

    结构型模式涉及到如何组合类和对象以形成更大的结构,例如适配器(Adapter)、装饰器(Decorator)、桥接(Bridge)、组合(Composite)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式有助于改善...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    java Decorator装饰模式例子

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...

    Java 中的设计模式 - jdon

    例如,适配器模式(Adapter)用于将不兼容接口的对象连接起来,装饰器模式(Decorator)允许动态地给对象添加新的行为或职责,代理模式(Proxy)提供一个代表对象来控制对原对象的访问。 3. 行为型模式:这类模式...

    装饰器模式(Decorator Pattern) 1. 装饰器模式简介 1.1 问题引入 1.2 装饰器模式的解决方案 2. 装饰器模式的定义和原理 2.1 定义 2.2 基本原理 2.3 装饰器模式

    7. 装饰器模式与其他设计模式的比较 7.1 装饰器模式 vs 代理模式 7.2 装饰器模式 vs 适配器模式 7.3 装饰器模式 vs 组合模式 7.4 装饰器模式 vs 策略模式 8. 装饰器模式的现实应用场景 8.1 Web应用中的请求处理 ...

    Java设计模式之装饰器模式.docx

    【Java设计模式之装饰器模式】装饰器模式是一种结构型设计模式,它的主要目的是在不修改已有对象的前提下,通过添加额外的职责来扩展对象的功能。这种模式遵循单一职责原则,使得扩展职责时不会破坏原有对象的结构。...

    java设计模式之装饰者模式代码

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展对象的功能,为对象提供新的行为,同时保持了代码的可读性和可维护...

    Java设计模式-装饰者模式

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时给对象增加新的行为或责任,而无需修改其源代码。这种模式通过创建一个与原对象具有相同接口的新对象(装饰者),并把原对象作为其内部成员,...

    设计模式(Java 与模式-笔记 二)

    接下来是装饰器模式(Decorator),它允许动态地给一个对象添加一些额外的职责,即扩展对象的功能,而又不破坏其结构。Java的IO流系统大量使用了装饰器模式,例如`BufferedReader`和`InputStreamReader`。 此外,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

Global site tag (gtag.js) - Google Analytics