代理模式

静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.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("收中介费");
    }
}

好处

可以使真实的操作更加纯粹,不用去关注一些公共业务的业务

公共业务交给了代理角色!实现了业务的分工!

公共业务发生扩展的时候方便集中管理

一个动态代理类就是一个接口

Last modification:September 23, 2022
如果觉得我的文章对你有用,请随意赞赏