在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解:

装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖。

  1. public interface Sourcable {
  2.  
  3. public void go();
  4. }
  5.  
  6. public class Source implements Sourcable {
  7.  
  8. public void go() {
  9. System.out.println("Source method go()");
  10. }
  11.  
  12. }
  13. public class Decorator implements Sourcable {
  14.  
  15. private Sourcable sourcable;
  16.  
  17. public Decorator(Sourcable sourcable){
  18. this.sourcable = sourcable;
  19. }
  20.  
  21. public void go() {
  22. //这里可以有你的处理
  23. sourcable.go();
  24. //这里可以有你的处理
  25. }
  26.  
  27. }

代理模式就像生活中的一些代理商一样,他们原本不做任何事,但是我们可以通过他买到一些我们需要的东西。

  1. public class ObjectDynamicProxy implements InvocationHandler{
  2.  
  3. //真实对象引入
  4. private Object proxyObj;
  5.  
  6. public void setObj(Object obj) {
  7. this.proxyObj = obj;
  8. }
  9.  
  10. public ObjectDynamicProxy(Object obj){
  11. this.proxyObj = obj;
  12. }
  13.  
  14. public Object invoke(Object object, Method method, Object[] args)
  15. throws Throwable {
  16.  
  17. System.out.println("before dynamic proxy method.");
  18.  
  19. Object obj = method.invoke(proxyObj, args);
  20.  
  21. System.out.println("after dynamic proxy method.");
  22.  
  23. return obj;
  24. }
  25.  
  26. /**
  27. * 代理对象生产工厂
  28. * @param obj
  29. * @return
  30. */
  31. public static Object factory(Object obj) {
  32. //获取传入对象的Class对象
  33. Class<?> classType = obj.getClass();
  34.  
  35. //生成代理对象并返回
  36. //该对象实现传入对象所实现的接口
  37. //生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用
  38. return Proxy.newProxyInstance(classType.getClassLoader(), classType
  39. .getInterfaces(), new ObjectDynamicProxy(obj));
  40. }
  41. }
  42.  
  43. public class Client {
  44.  
  45. @SuppressWarnings("unchecked")
  46. public static void main(String[] args) {
  47.  
  48. //通过代理对象生成工厂生成该代理对象
  49. List list = (List)ObjectDynamicProxy.factory(new ArrayList());
  50.  
  51. list.add("hello");
  52. }
  53. }

区别:

代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
  先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
  代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
  由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。
  具体例子可参看Java IO装饰/Spring的动态代理/Hibernate的代理等

用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,常常在一个代理类中创建一个对象的实例。
但是当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

需要理解更细的区别,我觉得这篇博客写的不错:

http://www.cnblogs.com/onlywujun/archive/2013/03/28/2985887.html

可以看看。

适配器模式,装饰模式,代理模式异同

http://blog.csdn.net/lulei9876/article/details/39994825

另外学习设计模式的基础知识为:

http://uule.iteye.com/blog/2078935

http://blog.csdn.net/tianhai110/article/details/6339565

JAVA设计模式:代理模式&& 装饰模式区别的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. Java设计模式の代理模式

    目录  代理模式 1.1.静态代理   1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...

  3. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  4. Java设计模式 - 代理模式

    1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...

  5. Java设计模式——代理模式实现及原理

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ...

  6. Java设计模式—代理模式

    代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下:     为其他对象提供一种代理以控制对这个对象的访问. 个人理解:        代理模式将原类进行封装, ...

  7. Java设计模式-代理模式(Proxy)

    其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...

  8. Java设计模式--代理模式+动态代理+CGLib代理

    静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...

  9. Java设计模式——代理模式

    public interface People { public void work(); } public class RealPeople implements People { public v ...

随机推荐

  1. Thinking in scala (4)----阶乘与尾递归

    code1: object factorial{ def main(args:Array[String])={ println(factorial(args(0).toInt)) } def fact ...

  2. Matlab笔记

    提取RGB分量,并显示出来 rgb=imread('mao.jpg'); rgb_r=rgb(:,:,); rgb_g=rgb(:,:,); rgb_b=rgb(:,:,); zero=zeros(, ...

  3. Less-css预处理编译

    node编译 第一步:https://nodejs.org/en/  到node官网下载最新的node 第二步:和普通软件一样把node安装好 第三步:运行-cmd,准备安装less 全局安装(整个电 ...

  4. android 菜单的总结

    安卓菜单有三种菜单. 选项菜单: 点击系统菜单按钮会触发 上下文菜单:长按屏幕触发 子菜单:某一个菜单的下一级菜单 具体的描叙:http://blog.csdn.net/zqiang_55/artic ...

  5. java中的Set的使用以及各种遍历方法(较为全面)

    1. 概述 Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品 ...

  6. c++ split()实现

    在c++中,没有java与python中定义的split()功能的函数,于是自己实现之. 情况1,适用范围,分隔符为字符.思路,记录分隔符的位置,判断需要截取的字符串的下标范围. vector< ...

  7. php 中 php-fpm 的重启、终止操作命令

    php-fpm没有启动nginx会报502的错误 php 5.3.3 下的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|s ...

  8. 3. 托管对象模型的迁移(Core Data 应用程序实践指南)

    本章介绍如何添加模型版本及模型映射,演示几种迁移技术,供在升级模型时使用. 3.1. 修改托管对象模型 3.2. 添加模型版本 3.3. 轻量级迁移方式 3.4. 默认的迁移方式 3.5. 通过迁移管 ...

  9. js原生之函数

    1.函数作为参数传给其他函数:    data.sort(function(a,b){return a-b})    //关于数组的sort函数,其回调函数返回负值,a在b之前    //正值,b在a ...

  10. Eclipse中javascript文件 clg 变为console.log();

    Eclipse中javascript文件 clg 变为console.log(); window>preferance>JavaScript>Editor>Templates ...