在房屋买卖过程当中,中介的作用是不可小看的,除了比较熟悉的人之外买卖双方一般都不敢自己交易,一个是不知道具体的买卖过程中的流程以及需要哪些材料,还有就是怕被骗,不知道如何验证买卖双方提供的信息的真实性,中介就扮演着处理这些功能的角色,我们通常做的就是把需要提供的材料给中介,然后就可以等待各个过程的结果,直到最后房屋买卖成功。这里的中介就类似 java 模式里面的 proxy,在调用代理的过程中只要提供需要的参数代理就能帮我们实现想要的结果,对调用者来说,需要面对的对象只有代理一个,而不要去面对具体的实现类。
话说一民工在网上看中一个二手房,于是联系中介,中介带他去看房,觉得还凑合,商定价钱,于是开始漫长的买房过程,交定金、交首付、提供收入证明、单身证明身份证,卖方则提供房产证、土地证、身份证、水、电、煤气、宽带、有线电视卡,签完买卖合同,中介开始运作,办贷款、交契税、领契税补贴、过户(水、电、煤气、宽带、有线电视),最后终于等到结果,一切OK,交易成功,当然中介也是要收费的。在这过程中,买卖双方只需要提供交易需要的材料,就可以等待中介的各个环节的结果,而不需要去跟具体的流程办理人员打交道,只要给中介手续费就可以了。
下面来模拟下买卖的过程:
首先买卖双方的资料是必须的
一、基本信息
package patterns.proxy.sample3;
public class Person {
protected String name;
protected String ID;
public String getName() {
return name;
}
public String getID() {
return ID;
}
}
二、买方
package patterns.proxy.sample3;
public class Buyer extends Person {
// 收入证明
private String income;
// 婚否
private boolean married;
public String getIncome() {
return income;
}
public boolean isMarried() {
return married;
}
public Buyer(String name, String ID, String income, boolean married) {
this.name = name;
this.ID = ID;
}
}
三、卖方
package patterns.proxy.sample3;
public class Seller extends Person {
// 房产所有权证书(房产证、土地证)
private String ownership;
public Seller(String name, String ID, String ownership) {
this.name = name;
this.ID = ID;
this.ownership = ownership;
}
public String getOwnership() {
return ownership;
}
}
四、房屋买卖需要的手续接口
package patterns.proxy.sample3;
public interface IProcedure {
// 验证卖房信息
void valid(Seller seller);
// 办贷款
void credit(Buyer buyer);
// 房产证、土地证、水、电、煤气、有线电视、宽带等过户
void transfer(Buyer buyer, Seller seller);
}
五、房屋买卖具体的各个手续如何办理
package patterns.proxy.sample3;
public class Procedure implements IProcedure {
public void valid(Seller seller) {
System.out.println("...\n卖房信息以及卖房人产权验证完成");
}
public void credit(Buyer buyer) {
System.out.println("...\n贷款手续完成\n" + buyer.name + " 贷款办理完成");
}
public void transfer(Buyer buyer, Seller seller) {
System.out.println("...\n过户手续完成\n" + seller.getName()
+ " 房产证、土地证、水、电、煤气、有线电视、宽带等已过户给 " + buyer.getName());
}
}
六、下面轮到代理出场
package patterns.proxy.sample3;
public class ProxyIntermediary implements IProcedure {
private IProcedure procedure;
public ProxyIntermediary(IProcedure procedure) {
this.procedure = procedure;
}
public void valid(Seller seller) {
System.out.println("中介代理验证卖房人产权和其他卖房信息");
procedure.valid(seller);
}
public void credit(Buyer buyer) {
System.out.println("中介帮 " + buyer.getName() + " 办理贷款手续");
procedure.credit(buyer);
}
public void transfer(Buyer buyer, Seller seller) {
System.out.println("中介帮助将 " + seller.getName() + " 房产过户给 " + buyer.getName());
procedure.transfer(buyer, seller);
}
}
七、开始交易
package patterns.proxy.sample3;
public class Transaction {
public static void main(String[] args) {
Buyer buyer = new Buyer("张三", "123", "收入证明", false);
Seller seller = new Seller("李四", "456", "房屋产权证明");
IProcedure procedure = new Procedure();
ProxyIntermediary pi = new ProxyIntermediary(procedure);
pi.valid(seller);
System.out.println("***********************************");
pi.credit(buyer);
System.out.println("***********************************");
pi.transfer(buyer, seller);
}
}
运行结果如下:
中介代理验证卖房人产权和其他卖房信息
...
卖房信息以及卖房人产权验证完成
***********************************
中介帮 张三 办理贷款手续
...
贷款手续完成
张三 贷款办理完成
***********************************
中介帮助将 李四 房产过户给 张三
...
过户手续完成
李四 房产证、土地证、水、电、煤气、有线电视、宽带等已过户给 张三
至此就是一个 proxy 模式的模拟实现
但还有一个问题,大家也许已经注意到了,代理类也去实现了流程接口,也就是说代理需要知道接口里面的每一个方法,当流程发生变化时,代理类也要相应的修改,因为就业务层面来说,国家会出台相应的政策刺激楼市或者给楼市降温,如契税优惠,这些变化都要体现在代理类里面,这时就感觉代理类适应能力有点不足了。这个时候 Dynamic Proxy 站出来了,说这事也不难,哥帮你搞定。
八、动态代理类
package patterns.proxy.sample3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyIntermediary implements InvocationHandler {
private Object dpObj;
public DynamicProxyIntermediary(Object dpObj) {
this.dpObj = dpObj;
}
public static Object factory(Object obj) {
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), new DynamicProxyIntermediary(obj));
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("开始动态代理");
Object obj = method.invoke(dpObj, args);
System.out.println("结束动态代理");
return obj;
}
}
九、动态代理的调用也要做相应的修改
package patterns.proxy.sample3;
public class DynamicProxyTransaction {
public static void main(String[] args) {
Buyer buyer = new Buyer("王五", "123", "收入证明", false);
Seller seller = new Seller("麻二", "456", "房屋产权证明");
IProcedure procedure = (IProcedure)DynamicProxyIntermediary.factory(new Procedure());
procedure.valid(seller);
System.out.println("***********************************");
procedure.credit(buyer);
System.out.println("***********************************");
procedure.transfer(buyer, seller);
}
}
可以看到代理里面没有具体的流程方法,而是利用 java 的反射机制查找具体的实现类的方法。
运行结果如下:
开始动态代理
...
卖房信息以及卖房人产权验证完成
结束动态代理
***********************************
开始动态代理
...
贷款手续完成
王五 贷款办理完成
结束动态代理
***********************************
开始动态代理
...
过户手续完成
麻二 房产证、土地证、水、电、煤气、有线电视、宽带等已过户给 王五
结束动态代理
Dynamic Proxy,它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
由于水平有限,有些没有理解到的地方欢迎拍砖,哈哈。