Java 代理模式

文章目录

  • 代理模式
    • 概述
    • 静态代理实现
    • 动态代理实现

代理模式

概述

  • 代理模式也称为委托模式,是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多,如代购、代理上网,打官司等。
  • 无法或不想直接访问某个对象时可以通过一个代理对象间接访问,委托对象和代理对象需要实现相同的接口。

角色介绍

  • 抽象主题类:定义真实主题类和代理类的共同接口方法。
  • 真实主题类:也称为被代理类、委托类,用于创建真实对象,执行具体的业务逻辑。
  • 代理类:持有真实对象的引用,其所实现的接口方法执行真实对象的方法,实现代理作用。

静态代理实现

抽象主题类

public interface IProduce {
     
    //生产CPU
    void createCPU();

    //生产摄像头
    void createCamera();

    //组装
    void produce();
}

真实主题类

public class XiaomiProduce implements IProduce {
     
    @Override
    public void createCPU() {
     
        System.out.println("生产CPU");
    }

    @Override
    public void createCamera() {
     
        System.out.println("生产摄像头");
    }

    @Override
    public void produce() {
     
        System.out.println("组装");
    }
}

代理类

public class ProxyProduce implements IProduce {
     

    private IProduce mProduce;

    public ProxyProduce(IProduce produce) {
     
        mProduce = produce;
    }

    @Override
    public void createCPU() {
     
        mProduce.createCPU();
    }

    @Override
    public void createCamera() {
     
        mProduce.createCamera();
    }

    @Override
    public void produce() {
     
        mProduce.produce();
    }
}

使用

public class Demo {
     
    public static void main(String[] args) {
     
        IProduce xiaomi = new XiaomiProduce();
        IProduce proxy = new ProxyProduce(xiaomi);
        proxy.createCPU();
        proxy.createCamera();
        proxy.produce();
    }
}
生产CPU
生产摄像头
组装

动态代理实现

代理模式分为静态代理和动态代理,静态代理是在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。也就是我们在编码阶段不需要知道代理谁,代理谁我们将会在代码运行时决定。Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。

动态代理类

public class DynamicProxyProduce implements InvocationHandler {
     

    //被代理对象
    private Object object;

    public DynamicProxyProduce(Object o) {
     
        object = o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     
        Object result = method.invoke(object, args);
        return result;
    }
}

使用

public class Demo {
     
    public static void main(String[] args) {
     
        //创建委托对象
        IProduce xiaomi = new XiaomiProduce();
        //创建动态代理
        DynamicProxyProduce dynamicProxy = new DynamicProxyProduce(xiaomi);
        //创建真实主题类的ClassLoader
        ClassLoader classLoader = xiaomi.getClass().getClassLoader();
        //动态创建代理类对象
        IProduce proxy = (IProduce) Proxy.newProxyInstance(classLoader, new Class[]{
     IProduce.class}, dynamicProxy);
        proxy.createCamera();
        proxy.createCPU();
        proxy.produce();
    }
}
生产摄像头
生产CPU
组装

你可能感兴趣的:(Java设计模式与算法,代理模式)