Java动态代理(以现实中我们熟悉的中介代理租房、卖房模式理解)(附案例详解)

关于代理,在北京生活过的人,第一反应就是中介。因为本人做过中介,所以对其内部运转也较为了解,现在就以中介买卖租赁房屋这个事情来详细地解答一下动态代理的实现。话不多说,上代码:(把代码连同注释复制下来粘贴到自己的eclipse里,可以运行,在eclipse里查看效果可能会更好)
public class FangWuJiaoYi {
public static void main(String[] args) {

	FangWuZhongJie zhongJie = new FangWuZhongJie();  //创建代理对象处理类的对象(创建代理对象)
	
	ZhenShiFangDong zhenFangDong = new ZhenShiFangDong(); //创建被代理类对象(一手房东/真实房东)
	zhongJie.chuShiHua(zhenFangDong);	//被代理对象初始化(初始化一手房东)
	ZuFang fangdong = (ZuFang) zhongJie.getObj();  //获取代理对象(并将其类型强制转化为所代理的对象的类的接口类型)
	fangdong.chuZu(); //通过多态,调用接口方法时,自动调用子类方法。
	
	System.out.println("-------------------boundary--------------------");
	MaiFang mai = (MaiFang)zhongJie.getObj();
	mai.maiMai();
	//委屈房东了,有房子,既能出租又能买卖,但是,交给中介打理时,却要签2分合同,一份是出租合同,一份是买卖合同。不能在一份合同中同时实现出租和买卖

// 在jdk的动态代理中,美中不足就是整个设计都是针对接口做的代理,如果是普通的类,我们无法通过这个方式代理对象(通过生成的代理类也知道没有接口是不行的)
// 所以下面的代码,编译时没有什么问题,但运行时就会报类型转换的错误: cannot be cast to dongTaiDaiLi.ZhenShiFangDong
// ZhenShiFangDong zhen = (ZhenShiFangDong)zhongJie.getObj();
// zhen.maiMai();
// zhen.chuZu();
// 但是我们知道 通过拼接字节码生成新的类 自由度是十分大的,这也就启示我们,设计不管是针对接口类还是普通类的代理类,是完全可行的,比如cglib框架就是通过拼接字节码来实现非接口类的代理。(以后有机会再讲)

	System.out.println("++++++++++++++++++boundary2+++++++++++++++++++++");
	ErFangDong erFangDong = new ErFangDong();  //创建被代理对象(二房东)
	zhongJie.chuShiHua(erFangDong);	//被代理对象初始化(二房东)
	ZuFang erfangdong=  (ZuFang) zhongJie.getObj();// 代理对象 获取代理权
	erfangdong.chuZu();//通过多态,调用接口方法时,自动调用子类方法。

// 在jdk动态代理中,美中不足就是整个设计都是针对接口做的代理,如果是普通的类,我们无法通过这个方式代理对象(通过生成的代理类也知道没有接口是不行的)
// 所以下面的代码,编译时都无法通过,更无法执行了。(我特意在ErFangDong类中,添加了一个weiXiuFangWu()的方法,却彻底废掉了,无法使用)
// erfangdong.weiXiuFangWu();

	System.out.println("———————————————————boundary3—————————————————————————————");
	ZuKe zuke = new ZuKe();//创建被代理对象(租客)
	zhongJie.chuShiHua(zuke);//初始化被代理对象(租客)
	ZuFang zuker = (ZuFang)zhongJie.getObj();//代理对象获取代理权
	zuker.zuLin();//通过多态,调用接口方法时,自动调用子类方法。()
}

}

interface ZuFang{

void chuZu();//接口公共的方法(出租房屋)
void zuLin();//接口公共的方法(租赁房屋)

}

interface MaiFang{

void maiMai();//接口公共方法(房屋买卖)

}

//被代理类(一手房东/真实房东)
class ZhenShiFangDong implements MaiFang,ZuFang{

@Override
public void chuZu() {
	System.out.println("大家好,我是北京的大房东,在5环之内有15套房,自己住一套,剩下都要出租,要出租的房屋一般都交给中介打理,中介挺黑的,一般要向房客收取一个月房租的中介费,有时候看我们着急出租,还要收我们一个月的中介费。好多看房的都是看完当天就租了,就带人看看房,轻松几千块到手.......");
}

@Override
public void maiMai() {
	System.out.println("虽然我一般把自己的房屋用来出租,但是行情好的时候,我也会出售部分手中的房子来变现。卖房也主要通过中介完成,好处是省心省力,但是中介也挺黑的,一般对买房的人收取2~3个点的服务费,有时候看你着急卖房,也会向我们房东收取1~2个点的服务费。北京一套上千万的房子,中介费动辄三五十万.....");
}

@Override
public void zuLin() {
	// TODO Auto-generated method stub
	
}

}

//被代理类(二房东)
class ErFangDong implements ZuFang{

@Override
public void chuZu(){
	System.out.println("大家好,我是二房东,手下目前有50 间/套 房,欢迎刚毕业的大学生前来租房。有时我们也需要和中介合作,来把房子出租出去,虽然中介有时候挺坑的。");
}

public void weiXiuFangWu() {
	System.out.println("大家好,我是二房东,我可以帮助自己的租客维修房屋,顺便挣点儿零花钱");
}

@Override
public void zuLin() {
	// TODO Auto-generated method stub
	
}

}

//被代理类(租客)
class ZuKe implements ZuFang{

@Override
public void chuZu() {
	// TODO Auto-generated method stub
	
}

@Override
public void zuLin() {
	System.out.println("大家好,我是北漂,我没房,在北京只能靠租房生活,每次租房都要被中介收取一个月的中介费,太狠了.......");
}

}

//代理类的处理类(作用)
// 1)创建代理对象
// 2)调用代理对象所代理的方法(调用被代理的方法)
class FangWuZhongJie implements InvocationHandler{

	Object obj; //被代理类对象的声明,可以代理很多被代理类的对象

	public void chuShiHua(Object obj) {
		this.obj = obj; //给被代理对象做初始化
	}

//代理对象(其实现方法和被代理类的实现方法是一样的)
//代理对象调用重写的那个方法,自动调用invoke()
	public Object getObj() {  //获取代理对象,返回代理对象
		return 	Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
	}

//proxy:代理对象;method:方法的描述对象;args:方法参数
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	
		System.out.println("大家好,我是北京的中介,我代理房屋买卖、出租等业务。通过代理收取一定的服务费");//代理对象自己的个性化处理
	
	//手动调用(委托类对象的方法)
		Object object = method.invoke(obj, args );//通过反射获取 被代理对象的方法
		return object;
	}

}

程序运行结果如下
大家好,我是北京的中介,我代理房屋买卖、出租等业务。通过代理收取一定的服务费
大家好,我是北京的大房东,在5环之内有15套房,自己住一套,剩下都要出租,要出租的房屋一般都交给中介打理,中介挺黑的,一般要向房客收取一个月房租的中介费,有时候看我们着急出租,还要收我们一个月的中介费。好多看房的都是看完当天就租了,就带人看看房,轻松几千块到手…
-------------------boundary--------------------
大家好,我是北京的中介,我代理房屋买卖、出租等业务。通过代理收取一定的服务费
虽然我一般把自己的房屋用来出租,但是行情好的时候,我也会出售部分手中的房子来变现。卖房也主要通过中介完成,好处是省心省力,但是中介也挺黑的,一般对买房的人收取2~3个点的服务费,有时候看你着急卖房,也会向我们房东收取1~2个点的服务费。北京一套上千万的房子,中介费动辄三五十万…
++++++++boundary2++++++++
大家好,我是北京的中介,我代理房屋买卖、出租等业务。通过代理收取一定的服务费
大家好,我是二房东,手下目前有50 间/套 房,欢迎刚毕业的大学生前来租房。有时我们也需要和中介合作,来把房子出租出去,虽然中介有时候挺坑的。
———boundary3—————
大家好,我是北京的中介,我代理房屋买卖、出租等业务。通过代理收取一定的服务费
大家好,我是北漂,我没房,在北京只能靠租房生活,每次租房都要被中介收取一个月的中介费,太狠了…

总结:我们发现执行结果,每次都绕不开中介…真是程序反应生活啊!(手动捂脸)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值