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

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

public interface Sourcable {

    public void go();
} public class Source implements Sourcable { public void go() {
System.out.println("Source method go()");
} }
public class Decorator implements Sourcable { private Sourcable sourcable; public Decorator(Sourcable sourcable){
this.sourcable = sourcable;
} public void go() {
//这里可以有你的处理
sourcable.go();
//这里可以有你的处理
} }

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

public class ObjectDynamicProxy implements InvocationHandler{

    //真实对象引入
private Object proxyObj; public void setObj(Object obj) {
this.proxyObj = obj;
} public ObjectDynamicProxy(Object obj){
this.proxyObj = obj;
} public Object invoke(Object object, Method method, Object[] args)
throws Throwable { System.out.println("before dynamic proxy method."); Object obj = method.invoke(proxyObj, args); System.out.println("after dynamic proxy method."); return obj;
} /**
* 代理对象生产工厂
* @param obj
* @return
*/
public static Object factory(Object obj) {
//获取传入对象的Class对象
Class<?> classType = obj.getClass(); //生成代理对象并返回
//该对象实现传入对象所实现的接口
//生成的代理对象的所有方法都由第三个参数的invoke方法来接管和调用
return Proxy.newProxyInstance(classType.getClassLoader(), classType
.getInterfaces(), new ObjectDynamicProxy(obj));
}
} public class Client { @SuppressWarnings("unchecked")
public static void main(String[] args) { //通过代理对象生成工厂生成该代理对象
List list = (List)ObjectDynamicProxy.factory(new ArrayList()); list.add("hello");
}
}

区别:

代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。
  先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如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. linux java.net.UnknownHostException异常

    异常场景: 使用InetAddress.getLocalHost().getAddress(); 获取address byte数组.在windows上开发的时候,没有问题.部署到linux时报 jav ...

  2. 理解Twisted与非阻塞编程

    先来看一段代码: # ~*~ Twisted - A Python tale ~*~ from time import sleep # Hello, I'm a developer and I mai ...

  3. 汇编语言实现led灯的跑马灯

    led实验1.看原理图 看设备工作的原理(可能需要阅读芯片手册),看设备与cpu的连接关系 GPIO具有输入输出功能.输入:cpu想知道io引脚是高电平还是低电平那么就是输入方式输出:cpu想控制io ...

  4. JDBC oracle 错误总结

    ORA-28040: No matching authentication protocol jdk:1.8 oracle:12c 使用ojdbc14.jar 报错:ORA-28040: No mat ...

  5. WebStorm界面出现中文乱码(出现口口口)

    不少刚刚使用WebStorm软件的童鞋,发现在新建一个项目时,如果输入中文,会显示成口口口.这个问题要怎么解决呢... 点一下界面上那个扳手图标(settings),快捷键Ctrl+Alt+S. 2 ...

  6. 1.4.2.5. 测试(Core Data 应用程序实践指南)

    测试的方法也很简单: 首先,在AppDelegate.h里面引用CoreDataHelper @property (strong, nonatomic, readonly)CoreDateHelper ...

  7. Windows server 2008 R2 64位系统安装ZendOptimizer-3.3.0a-Wind

    如果不安装ZEND的话,一些PHP网站程序使用ZEND加密后就无法使用,比如DISCUZ,SHOPEX,ECSHOP等,所以要想安装这些程序,ZEND是一定要安装的,要不会出现乱码等问题. 安装ZEN ...

  8. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  9. SQL查询今天、昨天、7天内、30天

    今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * from 表名 where ...

  10. Java中正则表达式的几种用法

    多数内容转载自:http://www.jb51.net/tools/regex.htm ,有改动 用到了java.util.regex包: 1. 验证 Pattern pattern = Patter ...