设计模式——代理模式介绍及与装饰者模式的区别
2017-10-13 16:48
555 查看
这次来总结下代理模式(静态代理以及动态代理)的使用,以及与装饰器模式的区别:
1. 代理(静态代理)模式:
1.1 简介
通俗地讲,代理模式就是提供一个代理,代替实际对象完成某些操作,从而控制对实际对象的访问。比如在实际生活中,我们需要买车,当客户不能或者不想直接去进行交易时,那么就需要一个中介——也就是代理,去帮客户去完成买车的操作,而客户并不需要去关注具体的业务实现。
1.2 代理模式中类的结构
公共抽象类或者接口:是实际对象和代理对象都要实现的接口
实际对象:被代理的实际类实现了公共接口,此对象是真正完成业务所引用的对象
代理类:代理类实现了公共接口,并在内部有实际对象的引用,从而可以对实际对象完成一些操作。
用框图来表示上面三者的关系如下图所示:
1.3 与装饰者模式的区别
从上面的框图我们可以看到,代理(静态代理)模式与装饰者模式十分相似,那么区别在哪了?我认为是在使用的场景上存在区别:装饰者模式主要用在需要扩展一个对象的功能,动态地增删功能这一场景。代理模式则恰恰与此相反,代理模式的使用不是为了扩展一个对象的功能,而是“控制”对对象的访问,“隐藏”一个对象的具体功能。
2. 实例分析:
仍然以“买车”这一业务为例,分析静态代理的使用。
2.1 创建公共接口:Business
2.2 创建被代理类,实现公共接口
2.3 创建代理类,实现公共接口,代理类中维护一个被代理对象的引用
2.4 测试下静态代理的使用——通过代理来买辆车吧!
2.5 测试结果如下
2.6 静态代理的不足之处
静态代理,需要我们在运行前手动创建代理类,所以多个类都实现代理就需要很多个代理。其次代理类和被代理类都需要实现同样的接口,如果接口发生变化,不仅会影响到被代理类,还会影响代理类,这样修改的地方会很多,类之间的耦合度太高。
那么有没有办法解决这一问题?当然有,那就是动态代理啊!下次写咯
1. 代理(静态代理)模式:
1.1 简介
通俗地讲,代理模式就是提供一个代理,代替实际对象完成某些操作,从而控制对实际对象的访问。比如在实际生活中,我们需要买车,当客户不能或者不想直接去进行交易时,那么就需要一个中介——也就是代理,去帮客户去完成买车的操作,而客户并不需要去关注具体的业务实现。
1.2 代理模式中类的结构
公共抽象类或者接口:是实际对象和代理对象都要实现的接口
实际对象:被代理的实际类实现了公共接口,此对象是真正完成业务所引用的对象
代理类:代理类实现了公共接口,并在内部有实际对象的引用,从而可以对实际对象完成一些操作。
用框图来表示上面三者的关系如下图所示:
1.3 与装饰者模式的区别
从上面的框图我们可以看到,代理(静态代理)模式与装饰者模式十分相似,那么区别在哪了?我认为是在使用的场景上存在区别:装饰者模式主要用在需要扩展一个对象的功能,动态地增删功能这一场景。代理模式则恰恰与此相反,代理模式的使用不是为了扩展一个对象的功能,而是“控制”对对象的访问,“隐藏”一个对象的具体功能。
2. 实例分析:
仍然以“买车”这一业务为例,分析静态代理的使用。
2.1 创建公共接口:Business
package designpatterns.proxy; /** * Created by Olive on 2017/9/11. */ public interface Business { void transaction(); }
2.2 创建被代理类,实现公共接口
package d 4000 esignpatterns.proxy; /** * Created by Olive on 2017/9/11. */ public class CarBusiness implements Business{ public void transaction() { System.out.println("I want to buy a car!"); } }
2.3 创建代理类,实现公共接口,代理类中维护一个被代理对象的引用
package designpatterns.proxy; /** * Created by Olive on 2017/9/11. * 静态代理,运行前手动创建代理类,所以多个类都实现代理就需要很多个代理 * 其次代理类和被代理类都需要实现同样的接口,如果接口发生变化,修改的地 * 方很多,耦合度太高 */ public class CarBusinessProxyStatic implements Business{ private Business business; public CarBusinessProxyStatic(){ System.out.println("use proxy"); // 持有需要代理的类的实例 business = new CarBusiness(); } public void transaction() { System.out.println("start proxy"); business.transaction(); System.out.println("end proxy"); } }
2.4 测试下静态代理的使用——通过代理来买辆车吧!
package designpatterns.proxy; /** * Created by Olive on 2017/9/11. * 静态代理主要是为了控制对对象的访问,隐藏一个对象的具体信息,例如: * 我们要买一辆车,但是这个交易并不是我们自己完成的,而是通过代理完 * 成了交易,使用者并不需要关注代理内部如何实现。 */ public class ProxyTest { public static void main(String[] args){ Business business = new CarBusinessProxyStatic(); business.transaction(); } }
2.5 测试结果如下
use proxy start proxy I want to buy a car! end proxy
2.6 静态代理的不足之处
静态代理,需要我们在运行前手动创建代理类,所以多个类都实现代理就需要很多个代理。其次代理类和被代理类都需要实现同样的接口,如果接口发生变化,不仅会影响到被代理类,还会影响代理类,这样修改的地方会很多,类之间的耦合度太高。
那么有没有办法解决这一问题?当然有,那就是动态代理啊!下次写咯
相关文章推荐
- 设计模式之代理模式和装饰者模式的区别(java)
- java 设计模式 (代理模式和装饰者模式的区别)
- java 设计模式中 装饰者模式 与 代理模式的区别
- 设计模式系列三 装饰者模式介绍
- 装饰者模式和代理模式的区别
- 设计模式--代理模式--以及和装饰模式的区别
- 结合代码分析装饰者模式和代理模式的区别
- 设计模式之代理模式and装饰者模式
- 抽象类和接口的区别(里面有适配器设计、工厂设计、代理设计模式)
- 装饰设计模式和代理设计模式的区别
- 装饰者设置模式和代理模式的区别
- java设计模式--代理模式--三种代理方式的区别
- 装饰者模式(附与代理模式的区别,乍看挺像)
- Java 代理模式和装饰者模式的区别
- Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别
- 【转】代理模式和装饰者模式的区别
- Java 代理模式和装饰者模式的区别
- 设计模式(2)--java动态代理及jdk和cglib的区别
- 设计模式中代理(proxy)与委托(delegate)的语义区别
- 代理模式和装饰者模式的区别