`
zhangwei_david
  • 浏览: 477182 次
  • 性别: 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. 行为型模式:这类模式...

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

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

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

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

    Java设计模式-装饰者模式

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

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

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

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

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

    设计模式-可复用面向对象软件的基础,JAVA设计模式

    装饰器模式(Decorator)可以在运行时动态地为对象添加新的行为;桥接模式(Bridge)将抽象部分与实现部分分离,使两者可以独立变化。 行为型模式主要涉及对象间职责分配和通信,如观察者模式(Observer),它定义...

Global site tag (gtag.js) - Google Analytics