美文网首页
设计模式学习笔记:代理模式-Proxy Pattern

设计模式学习笔记:代理模式-Proxy Pattern

作者: 哪吒小子 | 来源:发表于2019-01-07 15:27 被阅读6次

    代理模式是一种结构型设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。

    所谓代理,是指具有与被代理对象相同的接口的类,客户端必须通过代理与被代理的目标类进行交互,而代理一般在交互的过程中(交互前后),进行某些特定的处理。



    类视图

    1. IUserDao:是接口类,接口类可以有多个实现类,这样代理类就可以灵活的改变注入的实现类,而不需要修改代理类的代码。
    2. UserDao:是IUserDao的实现类,这里有具体的实现逻辑。
    3. UserDaoProxy:是代理类,由于需要拦截接口的save()方法,所以需要也要实现接口IUserDao;当然代理类也是要实现UserDao的实现方法的,所以这里需要注入UserDao的对象到target
    4. App:这个是客户端的调用,主要的逻辑是将目标对象UserDao注入到代理类中去,然后使用代理类来实现save()方法。
    代理模式

    代码实现

    1.设计接口

    public interface IUserDao {
        void save();
    }
    

    2.实现接口

    public class UserDao implements IUserDao {
        @Override
        public void save() {
            System.out.println("----已经保存数据!----");
        }
    }
    

    3.代理类

    必须实现接口

    public class UserDaoProxy implements IUserDao {
        //接收保存目标对象
        private IUserDao target;
        public UserDaoProxy(IUserDao target){
            this.target=target;
        }
        @Override
        public void save() {
            System.out.println("开始事务...");
            target.save();//执行目标对象的方法
            System.out.println("提交事务...");
        }
    }
    

    代理类的核心:

    1. 需要指明具体的实现类是哪个 -->> 这里通过构造方法传入具体的实现类 `target``;
    2. 需要拦截实现类中的执行方法 -->> 也就是说当客户端执行 save()方法时需要拦截方法,并且可以加入一些额外的操作。

    4.测试类

    public class App {
        public static void main(String[] args) {
            //目标对象
            UserDao target = new UserDao();
            //代理对象,把目标对象传给代理对象,建立代理关系
            UserDaoProxy proxy = new UserDaoProxy(target);
            proxy.save();//执行的是代理的方法
        }
    }
    

    客户端需要将具体的接口实现类 UserDao 注入到代理类中去,然后由代理类来执行相应的方法。


    应用场景

    1.Spring中Bean容器的注入就是结合反射和动态代理实现的

    2.Spring中的面向切面编程也使用了动态代理的思想

    SpringProxy 模式在 AOP 中有体现,比如 JdkDynamicAopProxyCglib2AopProxy


    关于上面两种动态代理的实现可以参考我的文章:Java中的三种代理模式

    相关文章

      网友评论

          本文标题:设计模式学习笔记:代理模式-Proxy Pattern

          本文链接:https://www.haomeiwen.com/subject/opsakqtx.html