专栏首页程序员小灰漫画:什么是 “代理模式” ?

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

————— 第二天 —————

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

public interface IStudentService {
    void insertStudent();
    void deleteStudent();
}

public class StudentService implements IStudentService {

    public void insertStudent(){
        //添加学生
    }

    public void deleteStudent(){
        //删除学生
    }
}
public class StudentService implements IStudentService {

    public void insertStudent(){
        System.out.println("准备添加学生");
        //添加学生
        System.out.println("添加学生成功");
    }

    public void deleteStudent(){
        System.out.println("准备删除学生");
        //删除学生
        System.out.println("删除学生成功");
    }

}
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();
    }
}

以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;
    }
}

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();
    }

}

—————END—————

喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容

点个[在看],是对小灰最大的支持!

本文分享自微信公众号 - 程序员小灰(chengxuyuanxiaohui),作者:小灰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 漫画:什么是 “设计模式” ?

    这本书是软件研发领域重要的里程碑,合著此书的四位作者 Erich Gamma,Richard Helm,Ralph Johnson ,John Vlisside...

    小灰
  • 漫画:什么是 “模因” ?

    他是一位武功高手,生平最得意的武功是降龙十八掌,可是他的儿女资质不佳,没有人能领悟这套武功,因此他的生平绝学眼看就要失传了。

    小灰
  • 漫画:什么是 “抽象工厂模式” ?

    所谓“工厂模式”,是三种常见设计模式的统称,它们分别是简单工厂模式、工厂方法模式、抽象工厂模式。

    小灰
  • 漫画:什么是 “抽象工厂模式” ?

    所谓“工厂模式”,是三种常见设计模式的统称,它们分别是简单工厂模式、工厂方法模式、抽象工厂模式。

    程序员的时光001
  • 漫画设计模式:什么是 “装饰器模式” ?

    在我们上面的例子中,Component接口相当于汽车接口,所有的被包装类、包装类,都继承于这个接口。

    肉眼品世界
  • 漫画设计模式:什么是 “装饰器模式” ?

    在我们上面的例子中,Component接口相当于汽车接口,所有的被包装类、包装类,都继承于这个接口。

    小灰
  • 漫画设计模式:什么是 “职责链模式” ?

    有一天,公司新来的产品经理有一个新需求,但她不知道这个需求应该由谁来负责。于是,她首先找到了小A:

    小灰
  • 漫画:什么是单例模式?(整合版)

    ————— 第二天 ————— 单例模式第一版: public class Singleton { private Singleton() {} ...

    程序猿DD
  • 漫画:什么是分布式锁?

    利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。

    后端技术探索

扫码关注云+社区

领取腾讯云代金券