根据我自己的理解 代理模式分两种 一种称为静态的代理,就是本篇所叙述的。静态代理模式是代理模式中最简单容易理解的一种。所谓代理,举个例子,就是比如A想让B办理一件事情,但A不能直接联系B办理,所以A通过一个和B有关系往来的人C来办理。让C联系B办理这件事。
这其中涉及到三个角色:
抽象主题角色: 这里就是所要办的事 这一个动作
真实主题角色: 就是实际办事的人,例子中为B
代理主题角色: 也就是我们常说的中介角色,例子中为C
还是回到这个例子,C让B办理的这个事情,C可以在B办理这个事情前后进行一些操作。 比如C可以送点见面礼给B,然后B心情好了就把事情办了,办完了事情,C还可以宴请一下B。
所以实际在办理A所托付的事情中,C作为中间角色,对整个办事流程进行了一写铺垫和扫尾的操作.
再举例说明,比如租房。我们可以选择自己找房子,也更多是找中介租房。
在这里, 出租这一动作 是一个抽象主题角色,房东是真实主题角色,具体是由房东来出租的。而中介是代理主题角色,是代理房东业主来出租他的房子。 而租户,则是终端用户了。
这样很好理解,代理角色是不会真正也去实现抽象主题的,他只是一个过渡中介,如果过渡中介也真的去实现了抽象主题(接口)的方法,那就不是代理中介了。 我们找中介租房,并不是中介自己有房子给我们租,他只是有业主的租房信息(持有业主的引用而已),否则,他就不是中介代理了,呵呵。
针对租房这个例子,我们抽象三个角色为:
抽象主题角色 Rent(租赁)
真实主题角色 Landlord(房东)
代理主题角色 Agency (中介)
抽象角色Rent 代码:
package com.longewri.proxy.demo01;
/*抽象主题角色 使用接口来进行
*也可以使用抽象类*/
public interface Rent {
//租赁方法
public void rent();
}
真实主题角色(房东) Landlord 代码:
package com.longewri.proxy.demo01;
/*
* Landlord 房东,真实主题角色 实现租赁接口Rent
* */
public class Landlord implements Rent{
public Landlord(){}
public void rent() {
System.out.println("房东将房屋出租,交易成功!");
}
}
代理主题角色(中介)Agency:
package com.longewri.proxy.demo01;
/**
* 代理角色为Agency(中介),其中包含真实角色Landlord(房东)的引用。通过Landlord对象来间接实现接口中的rent方法
*/
public class Agency implements Rent {
private Landlord ld = null;;
//构造方法
public Agency() {
}
// 交付房屋押金
public boolean giveDeposit() {
System.out.println("中介代缴房屋租金和押金.");
return true;
}
// 拿到房屋钥匙
public void getKey() {
System.out.println("中介给你房屋钥匙和租房合同.");
}
// 调用真实角色主题
public void rent() {
if (ld == null)
ld = new Landlord();
if (giveDeposit()) {
ld.rent();
getKey();
}
}
}
终端用户Lessee:
package com.longewri.proxy.demo01;
/*
* 终端用户(租户) 调用实例
* */
public class Lessee {
public static void main (String[] args){
Rent rt=new Agency();
rt.rent();
}
}
执行结果:
中介代缴房屋租金和押金.
房东将房屋出租,交易成功!
中介给你房屋钥匙和租房合同.
从执行结果可以看出,在执行了rent()方法同时,也执行了相关的前置和后置操作。
代码见附件: