代理模式,首先要有一个租客,要去找房东,但是找不到房东,所以要找中介,中介再去找房东,中介就是代理角色
中介和房东都要有租房子这个事件
抽象角色:一般会使用接口或者抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色
客户:访问代理对象的人
分为静态代理和动态代理
静态代理
好处:1.可以使真实角色(房东)只做自己的方法(租房),不用去管一些公共的方法(签合同) 2.公共类交给代理角色,实现业务分工3.公共业务发生扩展的时候,方便集中管理
缺点:一个真实角色就会产生一个代理角色,代码量太大,开发效率低
我是租房的人,我直接找房东租房,
package com.atguigu.zyk;
//租房的人
public class Client {
public static void main(String[] args) {
FangDong fangDong = new FangDong();
fangDong.rent();
}
}
package com.atguigu.zyk;
public class FangDong implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
是没问题的
但是我要找很多房东,才能找到我想要的房子,很麻烦,我可以直接找一个中介,中介就能帮我找到很多房子,而且中介可以帮我签合同,之类的,很省力。
package com.atguigu.zyk;
public class ZhongJie{
public static void rent() {
FangDong fangDong =new FangDong();
fangDong.rent();
qianhetong();
}
public static void qianhetong(){
System.out.println("签合同");
}
}
package com.atguigu.zyk;
public class Client {
public static void main(String[] args) {
ZhongJie zhongJie=new ZhongJie();
ZhongJie.rent();
}
}
动态代理
动态代理和静态代理角色一样
动态代理的类是动态生成的,不是直接写死的,动态代理分为两大类,
基于接口的动态代理,基于类的动态代理。
基于接口的,就是原生的jdk的动态代理。基于类的动态代理,cglib
也可以通过java字节码实现 javasist