`
hello_player
  • 浏览: 153661 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

从房屋买卖看 java proxy 模式

    博客分类:
  • Java
阅读更多

        在房屋买卖过程当中,中介的作用是不可小看的,除了比较熟悉的人之外买卖双方一般都不敢自己交易,一个是不知道具体的买卖过程中的流程以及需要哪些材料,还有就是怕被骗,不知道如何验证买卖双方提供的信息的真实性,中介就扮演着处理这些功能的角色,我们通常做的就是把需要提供的材料给中介,然后就可以等待各个过程的结果,直到最后房屋买卖成功。这里的中介就类似 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,由它接管实际的工作。

 

      由于水平有限,有些没有理解到的地方欢迎拍砖,哈哈。

 

 

 

 

分享到:
评论
3 楼 kensunhu 2012-06-20  
现抄现卖,AOP是Dynamic Proxy的最好应用。
2 楼 Mybeautiful 2011-09-06  
写的很好。
1 楼 liguirong98 2011-09-06  
相当不错,有意思

相关推荐

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

    Java ProxyServer是一个基于Java实现的代理服务器类,它在客户端和服务器之间起到了中继的作用,允许数据在两者间传输。代理服务器在计算机网络中的主要功能是提供代理服务,它可以隐藏客户端的真实身份,增加网络...

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    Proxy 模式学习代码

    在Java中,Proxy模式主要通过以下几种方式实现: 1. **静态代理**:在静态代理中,我们需要为每个真实对象创建一个代理对象,并在代理类中实现与真实对象相同的方法。这样,当客户端调用代理对象的方法时,实际上会...

    java Proxy 动态代理

    Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...

    proxy.rar java三种代理模式源码

    总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...

    java proxy demo 代理类的运用demo

    在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...

    java proxy

    Java代理在编程中是一种强大的设计模式,主要用于在不修改原有对象的情况下增强或扩展其功能。在Java中,有两种主要的代理实现方式:静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经确定了代理类和...

    代理模式java代码 Proxy(4)

    在Java中,代理模式可以通过多种方式实现,包括静态代理和动态代理。 在提供的文件列表中,我们可以看到以下几个关键类: 1. `ProxyDisplay`:这个名字暗示了它可能是代理模式中的代理类,用于代表或代替某个实际...

    java与模式光盘源码

    《Java与模式》是阎宏博士撰写的一本经典IT著作,深入浅出地探讨了如何在Java编程中应用设计模式。这本书的光盘源码包含了书中提到的各种模式的实例代码,为读者提供了实践和理解设计模式的宝贵资源。在本文中,我们...

    23种java设计模式.pdf

    行为模式是指在对象的行为上使用的模式,包括 Iterator(迭代模式)、Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Interpreter(解释器模式)、...

    JavaProxy Demo

    在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...

    JdkProxy.java

    JdkProxy.java

    代理模式java代码 Proxy(1)

    至于`中国java下载站.url`,这可能是一个链接到Java学习资源的网址,它并非代理模式的一部分,但强调了学习Java的重要性,尤其是对于理解和实践设计模式,如代理模式,这些资源可以帮助开发者扩展知识面,提升技能。...

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    在GIS领域,特别是使用Esri的ArcGIS技术时,经常遇到跨域问题,这是因为浏览器的安全策略限制了JavaScript从一个源加载资源到另一个源。为了解决这个问题,Esri提供了代理服务,它允许Web应用程序访问受限制的地理...

    JAVA 通过proxy代理方式访问internet资源

    JAVA 通过proxy代理方式访问internet资源,

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    java-sington-factory-proxy 开发模式

    在Java中,代理模式可以通过动态代理(Java.lang.reflect.Proxy)或者自定义代理实现。动态代理主要应用于AOP(面向切面编程),如日志记录、事务处理等,而自定义代理则更灵活,可以根据需求定制代理行为。 ```...

    简单工厂模式,工厂方法模式,抽象工厂模式和Proxy模式

    从简单工厂,到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下...

Global site tag (gtag.js) - Google Analytics