代理模式是对象的结构模式。代理模式给一个对象提供了一个代理对象,并由代理对象控制对象的引用。
所谓代理,就是一个人或一个机构代表另一个人或机构采取行动。
代理模式在设计模式中的定义就是:为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。
使用代理的显著好处是,系统提供了向真实主题传递客户请求的控制。代理主题可以在向真实主题传递客户请求之前执行特定的操作,并决定是否将请求传递给真实主题;代理主题可以在向真实主题传递请求后执行另外的一些操作。
代理模式中的“代理商”要想实现代理任务,就必须和被代理的“厂商”使用共同的接口(你可以想象为产品)。所以自然而然你会想到在java中使用一个抽象类或者接口(推荐)来实现这个共同的接口。于是代理模式就有三个角色组成了:
1.抽象主题角色:声明了真实主题和代理主题的共同接口。
2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
3.真实主题角色:定义真实的对象。
例子如下,有人要卖房子,可是他不清楚房子的价格,也不知道到哪找买家,于是他找了家房产中介(代理)来帮助他卖房。
Subject.java
package Proxy;
abstract public class Subject {
abstract public void SellHouse();
}
卖房者RealSubject.java
package Proxy;
//卖房者卖房
public class RealSubject extends Subject {
public void SellHouse() {
System.out.println("-------------卖房者卖房-------------");
}
}
房产中介ProxySubject.java
package Proxy;
//房产中介
public class ProxySubject extends Subject {
private RealSubject realSubject;
public void SellHouse() {
/*
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.SellHouse();
*/
System.out.println("-------------房产中介帮助房子定价-------------");
System.out.println("-------------房产中介帮助寻找客户-------------");
System.out.println("-------------房产中介帮助卖房-------------");
}
}
测试代码Client.java
package Proxy;
public class Client {
public static void main(String[] args) {
// 卖房者(Subject)卖房时找中介(Subject)
Subject subject = new ProxySubject();
subject.SellHouse();
}
}