代理模式

        假设一个系统已经有一个对象A,现在需要向这个系统加入一个新的对象C。对象C需要使用系统中已有的对象A,但是C不能像系统一在使用A这样使用A,要么是A提供的接口不符合C的要求,要么是A的功能需要进一步加强等。
        这时候可以选择修改对象A,也可以选择使用一个中介对象B,让对象B将调用传递给对象A。这样新的对象C使不必直接与系统中已有对象A打交道,而是通过对象B与A打交道;而对象B则可以利用这一有利位置为对象C提供一个与A完全不同的接口,或者做一些A 本来不做的操作,比如将客户端的请求计数等。B就是一个代理。
        代理模式下,一共有这样几种角色:
抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方也可以使用代理主题。
真实主题角色(RealSubject):真正的主题对象。
代理主题角色(ProxySubject):代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候替代真实主题;控制对真实主题的引用,负责在需要的时候创建(以及删除)真实主题对象;代理角色通常在将客户端调用传递给真实的主题对象之前或之后,都要执行某个操作,而不是单纯地将调用传递增给真实主题对象。
        以下是示例代码:
package  proxy;

public   interface  Subject  {

    
public void request();
    
}



package  proxy;

public   class  RealSubject  implements  Subject  {

    
public void request() {
        System.out.println(
this + ".request()");
    }

    
}



package  proxy;

public   class  ProxySubject  implements  Subject  {

    
private RealSubject real;
    
    
public void request() {
        preRequest();
        
if (real == null
            real 
= new RealSubject();
        real.request();
        postRequest();
    }

    
    
public void preRequest() {
        System.out.println(
this + ".preRequest()");
    }

    
    
public void postRequest() {
        System.out.println(
this + ".postRequest()");
    }


    
public static void main(String [] args) {
        Subject sub 
= new ProxySubject();
        sub.request();
    }

}

 运行结果:

proxy.ProxySubject@7ced01.preRequest()
proxy.RealSubject@765291.request()
proxy.ProxySubject@7ced01.postRequest()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值