`

【转】Java与模式: 代理(Proxy)模式、装饰(Decorator)模式

    博客分类:
  • JAVA
 
阅读更多
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。

装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。

一、原理图



其中类的职责如下:

抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任

二、下面通过一个软件项目例子来说明装饰模式的使用
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。

实现代码如下:

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:51:06 
* 项目 
*/ 
public interface Project { 

/** 
 * 写代码 
 */ 
  void doCoding(); 
}


/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:52:12 
* 代码工人 
*/ 
public class Employe implements Project{ 
    /** 
     * 编码 
     */ 
    public void doCoding(){ 
        System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!"); 
    } 
}


/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:51:26 
* 项目经理 
*/ 
public class Manager implements Project { 
    private Project project;        //实际上存放的是代码工人对象 

    public Manager(Project project) { 
        this.project = project; 
    } 

    /** 
     * 编码 
     */ 
    public void doCoding() { 
        //项目经理开始新的工作 
        startNewWork(); 
    } 

    /** 
     * 模板:定义项目经理自己的事情 
     */ 
    public void startNewWork() { 
        //项目经理在做早期工作 
        doEarlyWork(); 
        //项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干 
        project.doCoding(); 
        //项目经理在做收尾工作 
        doEndWork(); 
    } 

    /** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
    } 

    /** 
     * 项目经理做收尾工作 
     */ 
    public void doEndWork() { 
    } 
}


/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:45:18 
* 具体的项目经理A 
*/ 
public class ManagerA extends Manager{ 

    public ManagerA(Project project) { 
        super(project); 
    } 

    /** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
        System.out.println("项目经理A 在做需求分析"); 
        System.out.println("项目经理A 在做架构设计"); 
        System.out.println("项目经理A 在做详细设计"); 
    } 
}


/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:45:27 
* 具体的项目经理B 
*/ 
public class ManagerB extends Manager { 

    public ManagerB(Project project) { 
        super(project); 
    } 

     /** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
        System.out.println("项目经理B 在做需求分析"); 
        System.out.println("项目经理B 在做详细设计"); 
    } 

    /** 
     * 项目经理做收尾工作 
     */ 
    public void doEndWork() { 
        System.out.println("项目经理B 在做收尾工作"); 
    } 
}


/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:03:22 
* 客户端测试 
*/ 
public class Client { 
    public static void main(String args[]) { 
        Project employe = new Employe();        //代码工人 
        Project managerA = new ManagerA(employe); //项目经理 
        Project managerB = new ManagerB(employe); //项目经理 
        //以经理的名义将编码完成,功劳都是经理的,实际编码的是工人 
        managerA.doCoding(); 
        managerB.doCoding(); 
    } 
}



运行结果:


项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做需求分析
项目经理B 在做详细设计
代码工人 在编写代码,加班编啊编啊,终于编完了!
项目经理B 在做收尾工作

Process finished with exit code 0


这是代理模式的一种实:不同级别的用户对同一对象拥有不同的访问权利或某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动。

代理对象与被代理对象必须实现统一接口,在代理对象中可以实现通用的一些功能,并且在需要的时候再调用被代理的对象,如此被代理对象当中就可以仅保留与业务相关的职责。

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。


装饰模式修改如下:

public class Project { 

  void doCoding(){
         System.out.println("项目来了...");
  } 
}


public class Employe extends Project{ 

    public void doCoding(){ 
        System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!"); 
    } 
}


public class Manager extends Project { 
    private Project project;        //实际上存放的是代码工人对象 

    public Manager(Project project) { 
        this.project = project; 
    } 


    public void doCoding() { 
        //项目经理开始新的工作 
        startNewWork(); 
    } 


    public void startNewWork() { 
        //项目经理在做早期工作 
        doEarlyWork(); 
        //项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干 
        project.doCoding(); 
        //项目经理在做收尾工作 
        doEndWork(); 
    } 


    public void doEarlyWork() { 
    } 


    public void doEndWork() { 
    } 
}
  • 大小: 30.6 KB
分享到:
评论

相关推荐

    java23种设计模式详解+源码(绝对详解)

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):为子系统提供一个统一的接口,使子系统更加易用。 - 适配器模式(Adapter):将一个类的接口转换成客户希望的另一...

    23种java设计模式.pdf

    结构模式是指在对象之间的关系和结构上使用的模式,包括 Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade(外观模式)...

    java与模式光盘源码

    结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy)等,关注如何组合对象和类,以实现新的功能或改善原有结构。行为型模式如观察者(Observer)、模板方法(Template Method)和策略(Strategy)等...

    java与模式的源代码

    7. 代理模式:为其他对象提供一种代理以控制对这个对象的访问,如远程代理、虚拟代理等。 在"Java与模式"的源代码中,我们可以期待看到以上模式的实现示例,通过阅读和分析这些代码,开发者可以更好地理解和运用...

    java与模式,设计模式的应用

    7. 代理模式:Java的动态代理机制(java.lang.reflect.Proxy)可以实现接口的代理,常用于AOP(面向切面编程)中。 8. 策略模式:Java Collections框架中的Comparator接口,允许用户定义自己的比较策略。 设计模式...

    Java与模式(阎宏著)源码

    如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。它们帮助减少类之间的耦合,提高系统的灵活性。 ...

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

    2. **结构型模式**:如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、桥接(Bridge)、组合(Composite)、外观(Facade)和享元(Flyweight)。这些模式处理对象的组合和关系,提供更好的结构和接口,...

    java与模式(附源码)

    结构型模式处理对象组合和继承,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),这些模式用于改善类与类之间的关系。行为型模式则涉及对象间的职责分配,如观察者模式(Observer)、策略...

    java 23种设计模式及具体例子

    * 代理模式:代理模式是一种结构型模式,它提供了一种访问对象的方式,而不需要访问对象本身。 * 外观模式:外观模式是一种结构型模式,它提供了一种访问对象的方式,而不需要访问对象本身。 * 桥接模式:桥接模式是...

    JAVA设计模式(chm版)

    2. 结构型模式:关注对象组合和类的继承,例如适配器模式(Adapter)、装饰器模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。...

    java设计模式迷你手册.rar

    结构型模式关注如何组合类和对象以构建更复杂的结构,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),这些模式能够使不同组件之间更好地协作。行为型模式则关注对象间的交互和责任分配,...

    Java与模式

    2. **结构型模式**:如适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。这些模式关注如何组合和构建类...

    设计模式:Java语言中的应用.zip

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。比如,装饰模式允许动态地给对象添加新的行为或...

    java与模式.pdf

    - **代理模式(Proxy Pattern)**:为其他对象提供一个代理以控制对这个对象的访问。 - **命令模式(Command Pattern)**:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录...

    java设计模式ppt

    代理模式 (Proxy Pattern) 代理模式是一种结构型模式,为其他对象提供一个代理以控制对该对象的访问。代理模式主要用于添加额外的功能,如权限检查、性能优化等,而不会影响原始对象的实现。 #### 7. 原型模式 ...

    Java与模式.pdf

    结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy),关注于如何组合和包装对象以实现新的功能。行为型模式如观察者(Observer)、责任链(Chain of Responsibility)和策略(Strategy),则关注于...

    java 设计模式文档大全

    结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy),关注如何组合对象和类以构建更复杂的结构。行为型模式如策略(Strategy)、观察者(Observer)和状态(State),关注对象间的行为交互和职责...

    JAVA设计模式-chm版

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

    Java EE设计模式:Spring企业级开发最佳实践_JavaEE_企业应用开发_

    《Java EE设计模式:Spring企业级开发最佳实践》是一本深度探讨如何在企业级Java应用程序中有效运用设计模式的著作。这本书聚焦于Spring框架,它作为Java EE领域中最为广泛使用的开源框架之一,极大地简化了企业级...

    java设计模式PPT

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。如装饰模式可以在不修改原有对象的基础上添加新...

Global site tag (gtag.js) - Google Analytics