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
原创粉丝点击