Java设计模式:代理模式


     使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),且可以在不改变目标对象的情况下添加一些额外的功能。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,完成各种操作,并可以扩展功能。简而言之,可以通过代理完成真实的意图操作,并可以扩展业务功能


    Subject:抽象主题角色,抽象主题类可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求。
    RealSubject:具体主题角色,也叫被委托角色、被代理角色。是业务逻辑的具体执行者。
    Proxy:代理主题角色,也叫委托类、代理类。它把所有抽象主题类定义的方法给具体主题角色实现,并且在具体主题角色处理完毕前后做预处理和善后工作。代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 



Java设计模式:代理模式_目标对象



     就比如,我想找一份百度的工作,就有两种方式选择,(1)不用人帮忙,我自己瞎找(2)另外一种就是通过别人代理方式找,比如通过在百度工作的师兄师姐内推的方式,这种情况,只需要传递一个找工作的对象,告知师兄师姐代理就可以,师兄师姐帮你找到想要的工作,还可以推荐其他相关的工作给你,这就扩展原来的功能啦。



(1)接口:定义主题主要功能



/**
* 接口:定义主题主要功能
*/
public interface Object {
public abstract void operation();
}



(2)具体主题,真实的具体操作,但该操作不在客户端直接调用



/**
* 具体主题,真实的具体操作,但该操作不在客户端直接调用
*/
public class RealObject implements Object {
@Override
public void operation() {
System.out.println("在RealObject类中,真实的具体操作");
}
}



(3)代理类,代理真实的操作



/**
* 代理类,代理真实的操作
*/
public class ProxyObject implements Object {
private Object obj;

public ProxyObject(Object obj) {
this.obj = obj;// 设置代理的子类,即需要代理的真实对象
}
@Override
public void operation() {
// 调用目标对象之前可以做相关操作
System.out.println("在ProxyObject代理类中,调用目标对象之前可做相关的业务操作");
obj.operation();
// 调用目标对象之后可以做相关操作
System.out.println("在ProxyObject代理类中,调用目标对象之后还可做相关的业务操作");
}
}



(4)客户端程序



//客户端
public class Client {

public static void main(String[] args) {
System.out.println("---------不使用代理-------------");
Object obj;// 定义接口对象
obj = new RealObject();// 实例化真实的对象
obj.operation();// 直接使用真实类操作
System.out.println("---------使用代理-------------");
ProxyObject proxy = new ProxyObject(obj);// 传入代理的真实操作对象obj,由代理完成操作
proxy.operation();// 获得操作结果
}

}

输出:


---------不使用代理-------------
在RealObject类中,真实的具体操作
---------使用代理-------------
在ProxyObject代理类中,调用目标对象之前可做相关的业务操作
在RealObject类中,真实的具体操作
在ProxyObject代理类中,调用目标对象之后还可做相关的业务操作