美文网首页
代理模式

代理模式

作者: 会思考的鸭子 | 来源:发表于2017-07-18 15:28 被阅读0次

    核心作用

    通过代理,控制对象的访问。
    可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理

    核心角色

    • 抽象角色
      定义代理角色和真实角色的公共对外方法。
    • 真是角色
      实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
      关注真正的业务逻辑。
    • 代理角色
      实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
      将统一的流程控制放到代理角色。

    分类

    1. 静态代理
    2. 动态代理

    静态代理

    1. UML


      image.png
    2. 代码实现
    package com.amberweather.proxy.staticProxy;
    public interface Star {
        //面谈
        void confer();
        //签合同
        void signContract();
        //订票
        void bookTicket();
        //唱歌
        void sing();
        //管钱
        void collectMoney();
    }
    
    package com.amberweather.proxy.staticProxy;
    public class RealStar implements Star {
    
        @Override
        public void confer() {
            System.out.println("RealStar.confer()");
        }
    
        @Override
        public void signContract() {
            System.out.println("RealStar.signContract()");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("RealStar.bookTicket()");
        }
    
        @Override
        public void sing() {
            System.out.println("RealStar.sing()");
        }
    
        @Override
        public void collectMoney() {
            System.out.println("RealStar.collectMoney()");
        }
    }
    
    package com.amberweather.proxy.staticProxy;
    public class ProxyStar implements Star {
        private Star star;
        public ProxyStar(Star star) {
            super();
            this.star = star;
        }
        @Override
        public void confer() {
            System.out.println("ProxyStar.confer()");
        }
        @Override
        public void signContract() {
            System.out.println("ProxyStar.signContract()");
        }
        @Override
        public void bookTicket() {
            System.out.println("ProxyStar.bookTicket()");
        }
        @Override
        public void sing() {
            star.sing();
        }
        @Override
        public void collectMoney() {
            System.out.println("ProxyStar.collectMoney()");
        }
    }
    
    package com.amberweather.proxy.staticProxy;
    
    public class Client {
    
        public static void main(String[] args) {
            Star real = new  RealStar();
            Star proxy = new ProxyStar(real);
            proxy.confer();
            proxy.signContract();
            proxy.bookTicket();
            proxy.sing();
            proxy.collectMoney();
        }
    }
    
    image.png

    动态代理

    代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。

    相关文章

      网友评论

          本文标题:代理模式

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