【Java】静态代理

来源:互联网 发布:mysql tar.gz安装 编辑:程序博客网 时间:2024/06/03 23:42

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。所以代理通常充当中间人的角色。
这里写图片描述
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。

下面是一个用来展示(静态)代理结构的简单实例:

//相同的接口interface Interface{    void doSomething();    void somethingElse(String arg);}//委托类:class RealObject implements Interface{    public void doSomething(){        System.out.println("RealObject do something");    }    public void somethingElse(String arg){        System.out.println("RealObject say : "+arg);    }}//代理类:class SimpleProxy implements Interface{    private Interface proxy;    public SimpleProxy(Interface proxy){        this.proxy = proxy;    }    public void doSomething(){        System.out.println("预处理委托类的消息。。。");        proxy.doSomething();        System.out.println("进行后续处理。。。");    }    public void somethingElse(String arg){        System.out.println("代理说:"+arg);        proxy.somethingElse(arg);    }}public class SimpleProxyDemo {    //客户端方法:    public static void consumer(Interface iface){        iface.doSomething();        iface.somethingElse("hello!");    }    public static void main(String[] args) {        consumer(new RealObject());        System.out.println("----------------------");        //代理被插入到客户端与真实对象之间,代理就像“中间人”一样        consumer(new SimpleProxy(new RealObject()));    }}

【程序输出】:

RealObject do somethingRealObject say : hello!----------------------预处理委托类的消息。。。RealObject do something进行后续处理。。。代理说:hello!RealObject say : hello!

tips:为了看得更清楚一些,委托类的输出我用英文表示,代理类我用中文表示。

通过上述程序及其输出,我们可以看到,代理类可以将额外的操作从委托类中分离出来。那么分离的目的是什么呢?

通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。而且如果你想跟踪委托类中方法的方法的调用,或者度量这些调用的开销,那么这些代码肯定不希望合并带客户端的代码中去,因此代理使你更容易地添加或者移除它们。

1 0
原创粉丝点击