美文网首页
设计模式篇|代理模式

设计模式篇|代理模式

作者: 青年心路 | 来源:发表于2019-08-13 18:47 被阅读0次
    1.代理模式简介

    通过在访问者和提供者中间添加一个代理,这样可以避免访问者直接与提供者的访问。例如:生活中找歌手唱歌,首先需要找到歌手的经纪人,通过经纪人联系歌手。其中经纪人就是一个代理。

    作用
    • 通过代理,实现对某个对象的访问
    分类
    • 静态代理(静态定义代理类)
    • 动态代理(动态生成代理类)
      • jdk自带的动态代理
      • CGLIB
    动态代理相比于静态代理具有的优势:
    • 抽象角色(接口)声明的所有方法都被转移到一个集中的方法中处理,这样我们可以更加灵活和统一的处理众多方法。
    2.静态代理的实现

    这里使用明星和经纪人的例子进行表示

    • 创建接口
    public interface Star {
    
        //面谈
        void confer();
        //签合同
        void signContract();
        //订票
        void bookTicket();
        //唱歌
        void sing();
        //收尾款
        void collectMoney();
    }
    
    • 明星本人(真实角色)
    /**
     * 明星本人
     */
    public class RealStar implements Star {
    
        @Override
        public void confer() {
            System.out.println("真实角色面谈");
        }
    
        @Override
        public void signContract() {
            System.out.println("真实角色签合同");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("真实角色订票");
        }
    
        @Override
        public void sing() {
            System.out.println("真实角色唱歌");
        }
    
        @Override
        public void collectMoney() {
            System.out.println("真实角色收尾款");
        }
    }
    
    • 经纪人(代理角色)
    /**
     * 经纪人
     */
    public class ProxyStar implements Star {
    
        private Star star;
    
        public ProxyStar(Star star) {
            this.star = star;
        }
    
        @Override
        public void confer() {
            System.out.println("代理明星去面谈");
        }
    
        @Override
        public void signContract() {
            System.out.println("代理明星去签合同");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("代理明星去订票");
        }
    
        @Override
        public void sing() {
            //唱歌行为经纪人无法代理,所以需要调用歌手
            star.sing();
        }
    
        @Override
        public void collectMoney() {
            System.out.println("代理明星收尾款");
        }
    }
    
    • 测试
    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
    3.动态代理的实现(JDK)
    • 创建接口(抽象角色)
    public interface Star {
    
        //面谈
        void confer();
        //签合同
        void signContract();
        //订票
        void bookTicket();
        //唱歌
        void sing();
        //收尾款
        void collectMoney();
    }
    
    • 明星(真实角色)
    /**
     * 明星本人
     */
    public class RealStar implements Star {
    
        @Override
        public void confer() {
            System.out.println("真实角色面谈");
        }
    
        @Override
        public void signContract() {
            System.out.println("真实角色签合同");
        }
    
        @Override
        public void bookTicket() {
            System.out.println("真实角色订票");
        }
    
        @Override
        public void sing() {
            System.out.println("真实角色唱歌");
        }
    
        @Override
        public void collectMoney() {
            System.out.println("真实角色收尾款");
        }
    }
    
    • 经纪人(代理角色)
    public class StarHandler implements InvocationHandler {
    
        Star realStar;
    
        public StarHandler(Star realStar) {
            this.realStar = realStar;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            method.invoke(realStar,args);
            return null;
        }
    }
    
    • 测试
        @Test
        public void testProxy(){
            Star realStar = new RealStar();
    
            Star proxy = (Star) Proxy.newProxyInstance(realStar.getClass().getClassLoader(),
                    realStar.getClass().getInterfaces(), new StarHandler(realStar));
    
            proxy.sing();
        }
    

    运行效果图


    image.png

    相关文章

      网友评论

          本文标题:设计模式篇|代理模式

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