设计模式简述(六)代理模式

代理模式

描述

说到代理模式,Spring AOP 就是一种基于动态代理的实现。

基于原有方法进行功能增强的一种模式。

基本使用

  • 定义原有业务接口
java 复制代码
public interface IService {
    void action();
}
  • 定义原有业务类
java 复制代码
public class DefaultService implements IService{
    @Override
    public void action() {
        System.out.println("action.....");
    }
}
  • 定义代理类(直接在代理类中增强)
java 复制代码
public class ProxyService implements IService{
    private IService service;

    public ProxyService() {
        this.service = new DefaultService();
    }

    @Override
    public void action() {
        this.actionBefore();
        service.action();
    }

    private void actionBefore() {
        System.out.println("actionBefore...");
    }
}
  • 基于已有的增强接口增强(接口的本质就是能力,如果一个类要使用一个能力,则实现这个接口即可)
java 复制代码
public interface IProxy {
    void ens();
}
java 复制代码
public class EnsProxyService implements IService, IProxy {
    private IService service;

    public EnsProxyService() {
        this.service = new DefaultService();
    }

    @Override
    public void action() {
        this.ens();
        service.action();
    }

    @Override
    public void ens() {
        System.out.println("ens...");
    }
}

使用

java 复制代码
public class Sample {
    public static void main(String[] args) {
        IService service = new ProxyService();
        service.action();
    }
}

动态代理

所谓动态代理,不必在编码阶段把代理类生成出来,而是代码运行时,动态创建的代理对象。

基于JDK的动态代理

基于JDK的动态代理,需要代理的类必须声明接口。

  • 声明接口
java 复制代码
public interface IBizService {
    void biz();
}
  • 声明实现类
java 复制代码
public class DefaultBizService implements IBizService{
    @Override
    public void biz() {
        System.out.println("biz....");
    }
}
  • 基于JDK动态代理接口声明代理规则
java 复制代码
public class BizInvocationHandler implements InvocationHandler {
    private Object obj;

	// 传入要代理的对象
    public BizInvocationHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("invoke before...");
        Object result = method.invoke(obj, args);
        System.out.println("invoke after...");
        return result;
    }
}
  • 使用
java 复制代码
public class Sample {
    public static void main(String[] args) {
        IBizService bizService = new DefaultBizService();
        IBizService proxyInstance = (IBizService) Proxy.newProxyInstance(bizService.getClass().getClassLoader(), bizService.getClass().getInterfaces(), new BizInvocationHandler(bizService));
        proxyInstance.biz();
    }
}
  • 创建代理对象的过程实际还能封装(具有业务含义的封装需与对应的BizInvocationHandler绑定)
  • 声明通用接口
java 复制代码
public interface IdyProxy<T> {
    T getProxy(T obj);
}
  • 声明绑定handler的具体接口
java 复制代码
public class BizDyProxy<T> implements IdyProxy<T> {
    @Override
    public T getProxy(T obj) {
        T proxyInstance = (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new BizInvocationHandler(obj));
        return proxyInstance;
    }
}
  • 使用
java 复制代码
public class Sample {
    public static void main(String[] args) {
        IBizService bizService = new DefaultBizService();
//        IBizService proxyInstance = (IBizService) Proxy.newProxyInstance(bizService.getClass().getClassLoader(), bizService.getClass().getInterfaces(), new BizInvocationHandler(bizService));
//        proxyInstance.biz();

        BizDyProxy<IBizService> dyProxy = new BizDyProxy<>();
        IBizService proxy = dyProxy.getProxy(bizService);
        proxy.biz();
    }
}
相关推荐
软考真题app12 小时前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin033317 小时前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin18 小时前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan19 小时前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免20 小时前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死1 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新3 天前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762903 天前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式