设计模式之静态代理

Posted love-wzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之静态代理相关的知识,希望对你有一定的参考价值。

一 什么是代理

        代理(Proxy) 它是一种设计模式,提供了对目标对象另外的访问,即通过代理对象访问目标对象。这样做的好处就是可以在不改变目标对象实现前题下,增加额外的功能,即对目标对象的功能做扩展。

        举个例子:我们需要在一个方法的执行前和执行后添加日志记录功能,在不使用代理时,我们的方法调用如下

技术分享图片

此时,我们就需要修改当前的实现方法,不符合我们添加业务方法时不破换原有方法(目标对象)的设计思想。使用代理后,我们的方法调用如下

技术分享图片

这个时候,我们调用的时代理对象,这时我们就只需要在在代理类中添加我们的逻辑而不需要去修改目标对象。

二 静态代理的实现

        定义一个接口

1 public interface ICatDao {
2 
3     /**
4      * 保存
5      */
6     void save();
7 
8 }

        接口的实现类(目标对象)

1 public class CatDaoImpl implements ICatDao {
2 
3     @Override
4     public void save() {
5         System.out.println("保存信息");
6     }
7 }

        不使用代理,我们测试执行方法

1 public static void main(String[] args) {
2         //目标类
3         ICatDao userDao = new CatDaoImpl();
4 
5         userDao.save();
6 
7     }

        如果要添加日志,我们就需要修改save方法,在里边添加相应的操作记录。

        下来我们使用静态代理,创建一个静态代理对象

 1 public class CatDaoProxy implements ICatDao {
 2 
 3     /**
 4      * 目标对象
 5      */
 6     private ICatDao target;
 7 
 8     /**
 9      * 构造方法
10      */
11     public CatDaoProxy(ICatDao userDao) {
12         this.target = userDao;
13     }
14 
15     @Override
16     public void save() {
17         before();
18         target.save();
19         after();
20     }
21 
22     public void before(){
23         System.out.println("方法调用前");
24     }
25 
26     public void after(){
27         System.out.println("方法调用后");
28     }
29 
30 }

        测试,修改之前的测试方法

1 public static void main(String[] args) {
2         //目标类
3         ICatDao userDao = new CatDaoImpl();
4         //通过目标类,生成代理类
5         CatDaoProxy proxy = new CatDaoProxy(userDao);
6         //调用代理类实现的方法
7         proxy.save();
8     }

        执行结果

技术分享图片

        可以看到,我们没有修改save方法,也实现了在方法执行前和执行后添加日志记录。

 

以上是关于设计模式之静态代理的主要内容,如果未能解决你的问题,请参考以下文章

Spring之静态/动态代理模式

设计模式之代理模式-静态代理

Java设计模式-代理模式之动态代理(附源代码分析)

#yyds干货盘点# 设计模式之代理模式:静态代理

Java之静态代理模式

代理设计模式之静态代理与动态代理(超..)详解