zoukankan      html  css  js  c++  java
  • 设计模式之代理模式 Proxy

    定义与模型

    应用场景和分类

    代码实现

    staticProxy
    静态代理
    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) {
            super();
            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();
        }
    }
    调用
    dynamicProxy
    动态代理
    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("真实角色收钱");
        }
    
    }
    真实角色
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class StarHandler implements InvocationHandler{
    
        Star realStar;
        
        public StarHandler(Star realStar) {
            super();
            this.realStar = realStar;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //System.out.println("****查看调用过程*****"); //Client调用的时候经过这里
            
            Object object = null;
            
            System.out.println("真正的方法执行前,面谈,签合同,订票");
            if(method.getName().equals("sing")){
                object = method.invoke(realStar, args);
            }
            System.out.println("真正的方法执行后,收钱");
            return object;
        }
    
    }
    代理处理器
    public class Client {
    
        public static void main(String[] args) {
            Star realStar = new RealStar();
            StarHandler handler = new StarHandler(realStar);
            
            Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
            
            proxy.bookTicket();
            proxy.sing();
    
        }
    
    }
    调用

     推荐博客

    http://blog.csdn.net/rock_ray/article/details/22491763

  • 相关阅读:
    剑指OFFER之复杂链表的复制(九度OJ1524)
    剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
    剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
    剑指OFFER之从上往下打印二叉树(九度OJ1523)
    剑指OFFER之栈的压入、弹出序列(九度OJ1366)
    剑指OFFER之包含min函数的栈(九度OJ1522)
    剑指OFFER之顺时针打印矩阵(九度OJ1391)
    剑指OFFER之树的子结构(九度OJ1520)
    剑指OFFER之二叉树的镜像(九度OJ1521)
    VM安装CentOs7虚拟机后无法上网之解决方法
  • 原文地址:https://www.cnblogs.com/qingdaofu/p/7472844.html
Copyright © 2011-2022 走看看