在房屋买卖过程当中,中介的作用是不可小看的,除了比较熟悉的人之外买卖双方一般都不敢自己交易,一个是不知道具体的买卖过程中的流程以及需要哪些材料,还有就是怕被骗,不知道如何验证买卖双方提供的信息的真实性,中介就扮演着处理这些功能的角色,我们通常做的就是把需要提供的材料给中介,然后就可以等待各个过程的结果,直到最后房屋买卖成功。这里的中介就类似 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,由它接管实际的工作。
由于水平有限,有些没有理解到的地方欢迎拍砖,哈哈。
分享到:
相关推荐
我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...
java proxy 代理,全套开发code,带注释,以及相关工具
NULL 博文链接:https://cn-done.iteye.com/blog/1743191
Proxy 模式学习代码,包括静态代理,动态代理,cglib等
代理模式java代码 Proxy(4) 开发宝典......
java三种代理模式的源码,包含泛型改写
代理模式java代码 Proxy(1) java 学习必备......
NULL 博文链接:https://sunlibao123.iteye.com/blog/1837500
JdkProxy.java
用sun的JDK API实现java的动态代理类
JAVA Proxy 代理模式
从简单工厂,到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下...
java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其优良的代码...
是一个实现了代理服务的类。当有客户端连接时调用serve()方法,可以在客户和服务器端传输数据。
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
设计模式C++学习之代理模式(Proxy)
代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...