Java代理设计模式
来源:互联网 发布:淘宝客服不理人怎么办 编辑:程序博客网 时间:2024/06/06 13:03
简介
所谓代理设计模式指一个代理主题来操作真实主题,真实主题执行具体的业务逻辑,而代理主题负责其他相关业务的处理,比如经常的上网代理,客户通过网络代理连接网络,由代理服务器完成用户权限、访问权限等与上网有关的操作
UML类图
代理模式包含如下角色:
ISubject:抽象主题角色,是一个接口。真实主题和代理主题共用的接口。
RealSubject:真实主题角色,是实现抽象主题接口的类。
Proxy:代理主题角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他相关业务的操作,相当于对真实对象进行封装。
代码演示
上网接口
interface Network { public void browse();//定义浏览的抽象方法}
真实的上网操作
public class Real implements Network { @Override public void browse() { System.out.println("上网浏览信息"); }}
代理上网
public class Proxy implements Network{ private Network network; public Proxy(Network network) { this.network=network; } public void check(){ //与具体上网相关的操作 System.out.println("检查用户是否合法"); } @Override public void browse() { this.check();//这里你可以调用多个与具体业务有关的操作,这也是代理模式的重点 this.network.browse();//调用真实上网操作 }}
测试
实例化代理,同时传入代理的真实操作
public class TestDemo { public static void main(String[] args) { Network network; network=new Proxy(new Real()); network.browse(); }}
使用Java的代理机制进行日志输出
Java提供的InvocationHandler接口可以实现这个功能,首先编写一个日志代理类,该类实现InvocationHandler,然后编写一个接口,并实现这个接口,在实现类编写具体的考勤时候代码,这样就实现了日志和业务逻辑完全分离,只是在测试类结合起来
代理类LogProxy ,实现接口InvocationHandler,重点
//代理实现public class LogProxy implements InvocationHandler{ private Logger logger=Logger.getLogger(this.getClass().getName()); private Object delegate; //绑定代理对象 public Object bind(Object delegate){ this.delegate=delegate; /* 第一个参数:ClassLoader 第二个参数: Class<?>[] interfaces, 第三个参数:InvocationHandler h) */ return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this); } //针对接口编程 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; try { //在方法调用前进行日志输出 logger.log(Level.INFO,args[0]+"开始审核数据..."); result=method.invoke(delegate,args); //在方法调用后进行日志输出 logger.log(Level.INFO,args[0]+"审核数据结束..."); }catch (Exception e){ logger.log(Level.INFO,e.toString()); } return result; }}
接口TimeBookInterface
public interface TimeBookInterface { public void doAuditing(String name);}
实现类TimeBook ,业务逻辑类
public class TimeBook implements TimeBookInterface{ public void doAuditing(String name) { //审核数据的相关程序 }}
测试
public class Main1 { public static void main(String[] args) { LogProxy logProxy=new LogProxy(); TimeBookInterface timeBookInterface= (TimeBookInterface) logProxy.bind(new TimeBook()); timeBookInterface.doAuditing("张三"); }}
运行结果
五月 30, 2017 9:14:04 上午 LogProxy invoke
信息: 张三开始审核数据…
五月 30, 2017 9:14:04 上午 LogProxy invoke
信息: 张三审核数据结束…
0 0
- java 代理设计模式
- java代理设计模式
- java 代理设计模式
- Java设计模式:代理
- Java代理设计模式
- java设计-代理模式
- Java代理设计模式
- Java代理设计模式
- java代理设计模式
- java--代理设计模式
- java设计模式-代理模式
- Java设计模式-----代理模式
- java设计模式-代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- java设计模式---代理模式
- Java设计模式-代理模式
- Java 设计模式 代理模式
- Linux命令行与shell脚本(15)--sed使用
- delphi popupmenu下的tag值获取
- 【Oracle】内连接、外连接、(+)的使用
- matlab SVM有监督学习
- MySQL操作mysqldump命令详解
- Java代理设计模式
- 仿今日头条进行点击弹出输入框输入法弹起。按返回键输入框和输入法同时消失。并且监听输入法随输入框消失而消失
- 关于输入挂
- Spring IOC与AOP的理解
- 青蛙跳台阶问题,常见面试算法题,斐波那契数列(Fibonacci Sequence)
- ubantu系统安装备份完全实录
- apache kafka中server.properties配置文件参数说明
- 轮播器
- 性能优化十八之多线程优化-AsyncTask源码分析