• 设计模式之代理模式 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

  • 相关阅读:
    11.重写、抽象、接口、异常
    3.用户组、指令运行级别、帮助指令、文件目录类(一)
    2.vi和vim编辑器、vi和vim三种模式、vi和vim快捷键、关机、重启命令、用户管理
    1.VM和Linux系统(centos)安装、linux目录结构、远程登录到Linux服务器、远程上传下载文件xftp
    10.函数、流程控制
    9.变量、存储过程
    8.事务、视图
    7.库和表的管理、常见数据类型、常见约束、标识符
    CH6801 棋盘覆盖(二分图最大匹配)
    洛谷P1525 关押罪犯(二分图判定+二分)
  • 原文地址:https://www.cnblogs.com/qingdaofu/p/7472844.html
Copyright © 2020-2023  润新知