代理模式
来源:互联网 发布:知豆电动汽车官方网站 编辑:程序博客网 时间:2024/06/05 14:18
代理模式
介绍
在一些情况下,客户端不想或者不能够直接引用一个对象,而代理对象就可以在客户端和目标对象之间起到中介的作用。
代理设计模式:可以先简单理解为代理商或中介的概念,比如上网我们可能就会使用代理服务器去上网。
**典型的代理设计模式:**proxy对象不是真正的服务提供者,它只是负责中间一些验证监控或日志之类的操作。
备注:代理模式分为两种静态代理和动态代理
代理模式涉及的角色
抽象主题角色:声明了真实主题和代理主题的共同接口
代理主题(Proxy):代理主题角色内部含有对真实主题的引用,从而在任何时候可以操作真实主题对象
真实主题:定义了代理角色所代表的真实对象
静态代理
Subject(主题接口)
/** * Subject主题接口(有一个上网方法) * @author xuyi */public interface Subject { //定义上网功能 void surfTheInternet();}
RealSurfInternetSubject(真实主题实现类)
/** * 真实主题实现类(里面有一个具体的上网方法功能) * 同时又不希望这个方法对客户端直接暴露, * 所以借助代理对象来隔离与客户端的直接交互。 * @author xuyi * */public class RealSurfInternetSubject implements Subject { @Override public void surfTheInternet() { System.out.println("surf the internet ..."); }}
ProxySurfInternetSubject(代理主题对象)
/** * 代理主题上网对象 * * @author xuyi */public class ProxySurfInternetSubject implements Subject { private Subject subject; @Override public void surfTheInternet() { beforeSurf();// 上网之前的身份认证 if (subject == null) { subject = new RealSurfInternetSubject(); subject.surfTheInternet();// 实际上网操作 } afterSurf();// 上网之后的监控操作 } private void beforeSurf() { System.out.println("before surf 上网前操作"); // 比如上网前要进行上网者的身份验证等认证信息 } private void afterSurf() { System.out.println("after surf 上网后操作"); // 比如监控上网流量之类其它监控操作 }}
MainAPP
public class MainApp {public static void main(String[] args) { //初始化代理对象 ProxySurfInternetSubject proxySurfInternetSubject = new ProxySurfInternetSubject(); //通过代理对象的surfTheInternet()方法享受上网功能 proxySurfInternetSubject.surfTheInternet(); }}
动态代理
UserService接口
public interface UserService { void addUser(String username);}
UserServiceImpl实现类
public class UserServiceImpl implements UserService { @Override public void addUser(String username) { System.out.println("addUser info --->" + username); }}
PersonService接口
public interface PersonService { void addPerson(String name, int age);}
PersonServiceImpl实现类
public class PersonServiceImpl implements PersonService { @Override public void addPerson(String name, int age) { System.out.println("addPerson info --->name:" + name + " age:" + age); }}
ObjectProxy万能代理对象(最核心)
/** * 万能代理对象(看我取名字就能看出来了ObjectProxy) * * @author xuyi * */public class ObjectProxy implements InvocationHandler { private Object target; /** * 通过构造方法传入需要使用的主题实现类对象 * * @param target */ public ObjectProxy(Object target) { this.target = target; } /** * 使用Proxy创建代理对象实例<br> * 核心方法 * * @return */ public Object createProxy() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub beforeInvoke(); System.out.println(method.getName());// 输出执行方法名 printArgs(args);// 输出执行方法传入参数 Object result = method.invoke(target, args); afterInvoke(); return result; } private void beforeInvoke() { System.out.println("前置操作..."); } private void afterInvoke() { System.out.println("后置操作..."); } private void printArgs(Object[] args) { if (args != null && args.length > 0) { for (Object arg : args) { System.out.println(arg); } } else { System.out.println("无传入参数"); } }}
总结
动态代理是Spring AOP声明式事务实现的基础
0 0
- 代理模式--动态代理
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式 & 动态代理
- 代理模式--静态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-静态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- 代理模式--静态代理
- 代理模式!
- 代理模式
- JS
- response实现文件下载
- (1048, "Column 'user_id' cannot be null")
- bzoj1355【Baltic2009】Radio Transmission
- 01背包和部分背包问题
- 代理模式
- Java学习之路(第一天)
- bzoj3670【NOI2014】动物园
- 软件工程 — Chapter1
- 数据结构之链表
- HDU5694-BD String-数学归纳找规律
- CSS高效开发实战 4567
- Freedom, peace and love
- Web安全XSS&CSRF