代理模式(结构模式),“代理”就是受当事人委托;代表他进行某种活动;如诉讼、纳税、签订合同等。这当事人可以是一个人,一个单位或一个组织。现在代理这个词应该不陌生,代理商,代理公司,代理人。。。。。。
举个例子,拿房地产代理来说吧。卖房子的人要卖房子,但是他一般不会自己去找买房子的人,为什么捏?原因很多,可能是找不到买房的人,可能是自己很忙,没时间去找。总之自己找很烦,于是他就找了房产代理公司,然后说明自己的条件,房地代理公司根据房主的条件去找买房的人,找到之后并不是直接带给卖方,而是要先看房,跟买方谈条件,如果代理和买方觉得条件都满足,好,代理领他去见卖方完成交易。
这就是典型的代理的例子,UML图中,上面说到的卖方在就是RealSubject面代理公司是Proxy,买方自然就是Client,他们是通过一件事情联系在一起的,买卖房屋,也就是那个Subject接口。
为什么要使用Proxy呢?引用jdon论坛老大BanQ的文章中的一段:
1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问 论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限. (注:也就是说卖方不会去见所有要买房子的人,因为有些人可能不符合条件)
2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
举例两个具体情况:
(1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
(2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
(注:提高效率,让代理公司在后面去忙吧,我还可以做我自己的事情)
这就是使用Proxy的原因。
1确立功能
package dcr.study.dp.proxy;
public interface ISaleHouse {
void findBuyer();//找买方
void negotiation();//谈判
void complete();//成交
}
2实现功能
package dcr.study.dp.proxy;
public class RealSaleHouse implements ISaleHouse {
public void complete() {
System.out.println("与买方成交");
}
public void findBuyer() {
System.out.println("找买家");
}
public void negotiation() {
System.out.println("带买家看房,谈价格");
}
}
3建立代理
package dcr.study.dp.proxy;
/*
* 这个类里面并没有真正的实现findBuyer,complete和negotiation
* 而是在一些条件满足后,找到实际程序去完成这些操作。
* 比如,你可以把权限的验证放在这里
*/
public class SaleHouseProxy implements ISaleHouse {
private ISaleHouse saleHouse;
//这里,一个代理公司不会只代理一个房子,你想买哪个
//房子随你选,所以在构造里,我们可以选择我们要看的
//实际的房子
public SaleHouseProxy(ISaleHouse sh){
this.saleHouse = sh;
}
public void complete() {
//一些成交的条件如果满足,则找卖方完成交易
this.saleHouse.complete();
}
public void findBuyer() {
this.saleHouse.complete();
}
public void negotiation() {
//帮助卖方去谈一些条件
this.saleHouse.negotiation();
}
}
4调用
package dcr.study.dp.proxy;
public class Application {
public static void main(String[] args) {
//这里如果传入别的ISaleHouse的实现,就实现选择不同的房子
ISaleHouse sh =
new SaleHouseProxy(new RealSaleHouse());
sh.findBuyer();
sh.negotiation();
sh.complete();
}
}