12、设计模式(结构型)之代理模式

作用

  • 为其他对象提供一种代理以控制对这个对象的访问

何时使用

  • 想在访问一个类时做一些控制

优点

  1. 职责清晰
  2. 高扩展性
  3. 智能化

实例

  1. 动态代理
    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:18
     * @Version:
     * @Acton:  明星接口
     */
    public interface Star {
    
        void confer();              //面谈
        void signContract();        //签合同
        void bookTicket();          //订票
        void sing();                //唱歌
        void collectMoney();        //结尾款
    }

     

    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:22
     * @Version:
     * @Acton:  明星本人
     */
    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()");
        }
    }
    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:56
     * @Version:
     * @Acton:
     */
    public class StarHandler implements InvocationHandler {
    
        Star star;
    
        public StarHandler(Star star) {
            this.star = star;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object o = null;
            System.out.println("商谈");
            if(method.getName().equals("sing")){
                o = method.invoke(star,args);
            }
            System.out.println("结款");
            return o;
        }
    }
    public static void test1(){
            Star realStar = new RealStar();
            Star proxyStar = new ProxyStar(realStar);
            proxyStar.confer();
            proxyStar.signContract();
            proxyStar.bookTicket();
            proxyStar.sing();
            proxyStar.collectMoney();
        }

     

  2. 静态代理
    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:18
     * @Version:
     * @Acton:  明星接口
     */
    public interface Star {
    
        void confer();              //面谈
        void signContract();        //签合同
        void bookTicket();          //订票
        void sing();                //唱歌
        void collectMoney();        //结尾款
    }
    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:22
     * @Version:
     * @Acton:  明星本人
     */
    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()");
        }
    }
    /**
     * @Author: create_By: chenxin
     * @Data:Created in 2018/8/28 10:24
     * @Version:
     * @Acton:  代理人
     */
    public class ProxyStar  implements Star{
    
        private Star star;
    
        public ProxyStar(Star star) {
            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()");
        }
    }
    /* 测试静态代理 */
        public static void test2(){
            xin.chen.structural_type.proxy.dynamicProxy.Star realStar = new xin.chen.structural_type.proxy.dynamicProxy.RealStar();
            StarHandler handler = new StarHandler(realStar);
            xin.chen.structural_type.proxy.dynamicProxy.Star proxy = (xin.chen.structural_type.proxy.dynamicProxy.Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{xin.chen.structural_type.proxy.dynamicProxy.Star.class}, handler);
            proxy.sing();
    
        }

     

关系图

  1. 静态代理
  2. 动态代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值