漫画:什么是 “代理模式” ?

简介: 在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:

640.png640.png640.png640.png640.png640.png640.png

 

————————————

640.png640.png640.png640.png640.png640.png640.png640.png640.png640.png

 

public interface IStudentService {
    void insertStudent();
    void deleteStudent();
}
public class StudentService implements IStudentService {
    public void insertStudent(){
        //添加学生
    }
    public void deleteStudent(){
        //删除学生
    }
}

640.png640.png 

public class StudentService implements IStudentService {
    public void insertStudent(){
        System.out.println("准备添加学生");
        //添加学生
        System.out.println("添加学生成功");
    }
    public void deleteStudent(){
        System.out.println("准备删除学生");
        //删除学生
        System.out.println("删除学生成功");
    }
}

640.png640.png640.png640.png640.png640.png640.png640.png

public class StudentServiceProxy implements IStudentService {
    IStudentService studentService;
    public StudentServiceProxy(IStudentService studentService){
        this.studentService = studentService;
    }
    @Override
    public void insertStudent() {
        System.out.println("准备添加学生");
        studentService.insertStudent();
        System.out.println("添加学生成功");
    }
    @Override
    public void deleteStudent() {
        System.out.println("准备删除学生");
        studentService.deleteStudent();
        System.out.println("删除学生成功");
    }
}

 

在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。

在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。

这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:

public class Client {
    public static void main(String[] args) {
        IStudentService studentServiceProxy = new StudentServiceProxy(new StudentService());
        studentServiceProxy.insertStudent();
        studentServiceProxy.deleteStudent();
    }
}

640.png640.png640.png640.png640.png


Java语言为例,Java为我们提供了十分方便的创建动态代理的工具包。当我们生成动态代理的时候,我们需要使用到InvocationHandler接口和Proxy类。

具体的实现过程如下:




1.实现InvocationHandler接口,定义调用方法前后所做的事情:

public class StudentInvocationHandler implements InvocationHandler {
    private IStudentService studentService;
    public StudentInvocationHandler(IStudentService studentService){
        this.studentService = studentService;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName() + "方法调用前");
        method.invoke(studentService, args);
        System.out.println(method.getName() + "方法调用后");
        return null;
    }
}public class StudentInvocationHandler implements InvocationHandler {
    private IStudentService studentService;
    public StudentInvocationHandler(IStudentService studentService){
        this.studentService = studentService;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName() + "方法调用前");
        method.invoke(studentService, args);
        System.out.println(method.getName() + "方法调用后");
        return null;
    }
}

2.通过Proxy类的newProxyInstance方法,动态生成代理对象:

 

public class Client {
    public static void main(String[] args) {
        IStudentService studentService = new StudentService();
        InvocationHandler studentInvocationHandler = new StudentInvocationHandler(studentService);
        IStudentService studentServiceProxy = (IStudentService) Proxy.newProxyInstance(studentInvocationHandler.getClass().getClassLoader(), studentService.getClass().getInterfaces(), studentInvocationHandler);
        studentServiceProxy.insertStudent();
        studentServiceProxy.deleteStudent();
    }
}

640.png640.png640.png640.png640.png640.png


相关文章
|
8月前
|
设计模式 缓存 安全
小谈设计模式(8)—代理模式
小谈设计模式(8)—代理模式
|
8月前
|
设计模式
|
设计模式 数据库 缓存
23种设计模式漫画版系列—代理模式(一)
23种设计模式漫画版系列—代理模式(一)
99 0
|
设计模式 缓存 安全
2023-6-29-第十一式代理模式
2023-6-29-第十一式代理模式
77 0
|
设计模式 缓存 Java
设计模式之代理模式(文末赠书)
设计模式之代理模式(文末赠书)
74 0
|
设计模式 存储 缓存
【设计模式自习室】详解代理模式
《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的介绍,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的代码示例:熟悉该模式的代码长什么样子 该模式的优缺点:模式不是万金油,不可以滥用模式 该模式的应用案例:了解它在哪些重要的源码中被使用
151 0
|
设计模式 程序员 应用服务中间件
漫画设计模式:什么是 “职责链模式” ?
在上面这个链条当中,包含着不同的任务处理者。面对一个新任务,每个任务处理者需要判断自己能否处理该任务,如果能处理,则处理并返回;如果不能处理,则转交给下一个任务处理者,直到某一个任务处理者最终完成处理。这就是职责链模式的核心思想。
207 0
漫画设计模式:什么是 “职责链模式” ?
|
设计模式
漫画:设计模式之 “外观模式”
这里所谓的“套餐”,就是底层细粒度接口的不同组合。在保留底层接口不变的前提下,中间层为调用方提供了便利。 这正是外观模式(Facade Pattern)的设计思想: To make a complex subsystem easier to use, a simple interface should be provided for a set of interfaces in the subsystem. 为了使复杂的子系统更容易被使用,应当为子系统的众多接口提供一个简洁的高层接口。
148 0
漫画:设计模式之 “外观模式”
|
设计模式 自动驾驶 Java
漫画设计模式:什么是 “装饰器模式” ?
装饰器模式都包含哪些核心角色呢? 1. Component接口 2. ConcreteComponent类 3. Decorator抽象类 4. ConcreteDecorator类
172 0
漫画设计模式:什么是 “装饰器模式” ?
|
XML 设计模式 Java
漫画:什么是 “抽象工厂模式” ?
抽象工厂模式: 抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。
210 0
漫画:什么是 “抽象工厂模式” ?