`
zhangwei_david
  • 浏览: 468909 次
  • 性别: 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版本二十三种设计模式.zip

    - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链...

    java设计模式之装饰器模式(Decorator)

    主要为大家详细介绍了java设计模式之装饰器模式Decorator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    33种JAVA设计模式DEMO

    装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of ...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入...第27章 装饰器(decorator)模式 242 第28章 迭代器(iterator)模式 259 第29章 访问者(visitor)模式 278

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/structure/decorator //12.2装饰器模式 pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/...

    Java设计模式之装饰模式(Decorator模式)介绍

    主要介绍了Java设计模式之装饰模式(Decorator模式)介绍,本文讲解了为什么使用Decorator、如何使用装饰模式、Jive中的Decorator实现等内容,需要的朋友可以参考下

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    java设计模式教程+源代码

    Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式...

    设计模式_装饰器模式.zip

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...

    研磨设计模式-part2

    第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part4

    第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part3

    第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    java 设计模式 源码 欢迎访问DesignPattern项目 ...装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter

    design-pattern-java.pdf

    设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...

    Java装饰器设计模式_动力节点Java学院整理

    使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能...

    23种java设计模式

    2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    Pattern-Decorator-Java:设计模式工作坊——装饰者模式

    您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...

    JAVA经典设计模式大全

    1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 ...

Global site tag (gtag.js) - Google Analytics