JAVA设计模式:代理模式&& 装饰模式区别
在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解:
装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖。
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设计模式:代理模式&& 装饰模式区别的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- Java设计模式の代理模式
目录 代理模式 1.1.静态代理 1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- Java设计模式 - 代理模式
1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...
- Java设计模式——代理模式实现及原理
简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ...
- Java设计模式—代理模式
代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 个人理解: 代理模式将原类进行封装, ...
- Java设计模式-代理模式(Proxy)
其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...
- Java设计模式--代理模式+动态代理+CGLib代理
静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...
- Java设计模式——代理模式
public interface People { public void work(); } public class RealPeople implements People { public v ...
随机推荐
- mysql 常用指令
修改表的字符集 88down voteaccepted If you want to change the table default character set and all character ...
- 报错:Can't bind to local 8647 for debugger
修改8600为8601,并且勾上Use ADBHOST
- Unity中使用多构造函数
如果要实例化的类只有一个构造函数, 则使用方法很简单使用方法如下: 1 2 3 4 5 6 7 using (IUnityContainer container = new UnityContaine ...
- PAT1013 数素数
思路: 打印素数表 然后找出对应区间[m,n]中的素数 #include <iostream> #include <vector> #include <cmath> ...
- Myeclipse程序调试快捷键及步骤详解
Myeclipse程序调试快捷键及步骤详解: 调试快捷键 Eclipse中有如下一些和运行调试相关的快捷键. 1. [Ctrl+Shift+B]:在当前行设置断点或取消设置的断点. ...
- QT第六天学习
基本事件: 鼠标事件 键盘事件 绘制事件 1.QT中的事件: 事件是对各应用程序需要知道的由应用程序内部或外部产生的事情或动作的通称. QT中事件的处理: 在QT中使用一个对象来表示一个事件,继承自Q ...
- js原生设计模式——6复杂对象的构建—Builder建造者模式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- MyBatis Generator 的使用
1,以插件的形式加入到eclipse/dropins中: 2,设置mybatis-generator.xml文件: <?xml version="1.0" encoding= ...
- MyBatis 的Mapper中有小于号的处理
<![CDATA[ select * from person t where t.birthday < #{birthday} ]]> 也可以进行转义: < < 小于号 ...
- 搭建Minisipserve服务器实现局域网内IOS客户端idoubs的通信
idoubs是IOS设备开发的第一款全功能并开放源码的3GPP IMS客户端,它同时专为IOS平台开发设计的voIP测试版客户端,以doubango为框架,能实现当前最先进的多媒体功能,主要功能有:语 ...