17.结构型 - 代理模式 (Proxy)

1.定义

  • 通过代理对象来间接访问真实对象,简化用户端的代码逻辑

2.UML类图

在这里插入图片描述

  • 角色介绍
    ISubject : 主题抽象接口
    RealSubject : 真实主题类
    ProxySubject : 代理主题类
  • 要点说明
    静态代理方式,真实主题与代理主题需要实现同一接口,并且代理主题持有真实主题引用

3.UML示例代码

/**
 * Copyright (C), 2016-2020
 * FileName: ISubject
 * Author: wei.zheng
 * Date: 2019/12/31 9:16
 * Description: 抽象主题接口
 */
public interface ISubject {
    void visit();
}
/**
 * Copyright (C), 2016-2020
 * FileName: RealSubject
 * Author: wei.zheng
 * Date: 2019/12/31 9:17
 * Description: 具体主题类
 */
public class RealSubject implements ISubject {
    @Override
    public void visit() {
        System.out.println("Visit RealSubject");
    }
}

静态代理示例

/**
 * Copyright (C), 2016-2020
 * FileName: ProxySubject
 * Author: wei.zheng
 * Date: 2019/12/31 9:17
 * Description: 代理主题类 - 静态代理
 */
public class ProxySubject implements ISubject {
    private ISubject subject;

    public ProxySubject(ISubject subject) {
        this.subject = subject;
    }

    @Override
    public void visit() {
        subject.visit();
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: Client
 * Author: wei.zheng
 * Date: 2019/12/31 9:20
 * Description: 代理模式用户类
 */
public class Client {
    public static void main(String[] args) {
        ISubject realSubject = new RealSubject();

        ISubject proxySubject = new ProxySubject(realSubject);
        proxySubject.visit();
    }
}

动态代理示例

/**
 * Copyright (C), 2016-2020
 * FileName: DynamicProxy
 * Author: wei.zheng
 * Date: 2019/12/31 9:23
 * Description: 动态代理类
 */
public class DynamicProxy implements InvocationHandler {
    private Object object;

    public DynamicProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object, args);
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: DynamicClient
 * Author: wei.zheng
 * Date: 2019/12/31 9:25
 * Description: 动态代理用户类
 */
public class DynamicClient {
    public static void main(String[] args){
        RealSubject realSubject = new RealSubject();

        DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
        ClassLoader classLoader = realSubject.getClass().getClassLoader();

        ISubject proxySubject = (ISubject) Proxy.newProxyInstance(classLoader,new Class[]{ISubject.class},dynamicProxy);
        proxySubject.visit();

    }
}
// 运行结果
2019-12-31 21:51:03.224 21366-21366/com.example.proxy I/System.out: 静态代理
2019-12-31 21:51:03.225 21366-21366/com.example.proxy I/System.out: Visit RealSubject
2019-12-31 21:51:03.225 21366-21366/com.example.proxy I/System.out: 动态代理
2019-12-31 21:51:03.228 21366-21366/com.example.proxy I/System.out: Visit RealSubject

4.总结

  • 静态代理
    优点:用户类与真实主题类解耦
    缺点:几乎无缺点
  • 动态代理
    通过一个代理类来代理多个真实主题类,本质上是将代理类与真实主题类解耦
发布了37 篇原创文章 · 获赞 0 · 访问量 565

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103789046