代理模式
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态:在程序运行时运用反射机制动态创建而成。
静态代理
角色分析
抽象角色:一般用接口或者抽象类解决
真实角色:被代理的角色
代理角色:代理真实角色,代理真实角色之后我们一般会做一些附属操作
客户:访问代理对象的人
代码
代理的借口
package daili;
//租房
public interface Rent {
public void rent();
}
被代理的类房东
package daili;
//房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
代理别人的类中介
package daili;
//代理
public class Proxy implements Rent{
private Host host;
public Proxy(){
}
public Proxy(Host host){
this.host=host;
}
@Override
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房");
}
//签合同
public void hetong(){
System.out.println("签租赁合同");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
}
访问代理对象的人
package daili;
public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
优缺点
优点
可以使真实的角色的操作更加的纯粹,不用去关注一些公共的业务
公共的业务也就交给代理角色,实现了业务的分工
公共业务发生扩展的时候,方便集中管理
缺点
一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率也会变低
动态代理
简介
动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为俩大类:基于接口的动态代理,基于类的动态代理
- 基于接口-jdk动态代理
- 基于类:cglib
代码
租房接口
package jdk;
//租房
public interface Rent {
public void rent();
}
房东类
package jdk;
//房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
中介代理类
package jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用这个类自动生成代理
public class ProxyInvocationHandler implements InvocationHandler {
private Rent rent;
public void setRent(Rent rent){
this.rent=rent;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this);
}
//处理代理实例并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,就是反射机制
seeHouse();
method.invoke(rent);//会传入执行的方法
fare();
return null;
}
public void seeHouse(){
System.out.println("中介在看房子");
}
public void fare(){
System.out.println("收中介费");
}
}
好处
可以使真实的操作更加纯粹,不用去关注一些公共业务的业务
公共业务交给了代理角色!实现了业务的分工!
公共业务发生扩展的时候方便集中管理
一个动态代理类就是一个接口