目录
Proxy 代理模式
目录
[TOC]
1. 概述
1.1. 设计模式定义
代理模式(Proxy)是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。
1.2. 自我理解
对一个对象进行封装,比如有一个老代码中间有一个核心类,需要增加监控功能,但是该功能又不需要在老业务中使用,这时候可以使用代理模式来进行额外功能的增加了。
而代理模式有两种,静态代理、动态代理
1.3. 静态代理
每一个代理类都必须实现一遍委托类(也就是realsubject)的接口,如果接口增加方法,则代理类也必须跟着修改。其次,代理类每一个接口对象对应一个委托对象,如果委托对象非常多,则静态代理类就非常臃肿,难以胜任。
1.4. 动态代理
动态代理有别于静态代理,是根据代理的对象,动态创建代理类。这样,就可以避免静态代理中代理类接口过多的问题。动态代理是实现方式,是通过反射来实现的,借助Java自带的java.lang.reflect.Proxy
,通过固定的规则生成。
1.5. 代理模式的组成
Subject:主题,接口。
ConcreteSubject:具体的主题类
Proxy:代理类
2. UML
3. Example
3.1. Proxy静态代理设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public static void main(String[] args) { Subject subject = new ConcreteSubject(); Subject proxy = new Proxy(subject); proxy.request(); } public interface Subject { void request(); } public static class ConcreteSubject implements Subject { public void request() { System.out.println("执行请求"); } } public static class Proxy implements Subject { private Subject subject; public Proxy(Subject subject) { this.subject = subject; } public void request() { System.out.println("执行额外的条件判断,拷贝是否要调用subject的request()方法"); boolean invoke = true; if(invoke) { subject.request(); } } } |
3.2. Proxy动态代理设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class DynamicProxyPatternDemo { public static void main(String[] args) { Subject concreteSubject = new ConcreteSubject(); DynamicProxy proxy = new DynamicProxy(concreteSubject); ClassLoader classLoader = concreteSubject.getClass().getClassLoader(); Subject subject = (Subject)Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy); subject.request(); } public interface Subject { void request(); } public static class ConcreteSubject implements Subject { public void request() { System.out.println("执行请求"); } } public static class DynamicProxy implements InvocationHandler { private Object object; public DynamicProxy(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("执行额外的逻辑"); Object result = method.invoke(object, args); return result; } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/proxy-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。