zoukankan      html  css  js  c++  java
  • 再战设计模式(七)之代理模式

    代理模式

    代理模式是工作中很重要的一个角色,相信大家对aop已经不再陌生,这里我举个例子 假设很多人都找周杰伦唱歌.他需要

    1.面谈

    2.合同起草

    3.签字,收预付款

    4.安排机票

    5.唱歌

    6.收尾款

      那么如果有很多人都要去找周杰伦唱歌,那么周杰伦就忙不过来了.这个时候他找一个经济人来帮他把重复的工作做了.那么他就只需要唱歌就好了.这就是我们所谓的代理模式

    应用场景

    1.安全代理:屏蔽对真实对象的访问

    2.延迟加载.你获取到的是一个代理对象.真正用的时候才会使用真正的角色

    分类:

    静态代理(静态定义代理类)

    动态代理(动态生成代理类)

    1. jdk自带的动态代理
    2. javaassits 字节码操作库实现
    3. CGlib实现动态代理
    4. ASM(底层使用指令.,可维护性比较差)

    实现demo

    静态代理:

    public class RealStar implements  Star {
    
        public void confer() {
            System.out.println("RealStar.confer");
    
        }
    
        public void signContract() {
            System.out.println("RealStar.signContract");
    
        }
    
        public void sing() {
            System.out.println("周杰伦唱歌...");
    
        }
    
        public void collect() {
            System.out.println("RealStar.collect");
    
        }
    }
    
    public  interface Star {
    
        void confer();
        void signContract();
        void sing();
    
        void collect();
    
    
    
    }
    public class StarAdapter implements Star{
        private Star star;
    
        public StarAdapter(Star star) {
            this.star = star;
        }
    
        public void confer() {
            System.out.println("StarAdapter.confer");
        }
    
        public void signContract() {
            System.out.println("StarAdapter.signContract");
        }
    
        public void sing() {
            star.sing();
        }
    
        public void collect() {
            System.out.println("StarAdapter.collect");
        }
    }
    
    public class Client {
        public static void main(String[] args) {
    
            Star realStar = new RealStar();
            StarAdapter adapter = new StarAdapter(realStar);
    
            adapter.confer();
            adapter.signContract();
            adapter.sing();
            adapter.collect();
    
        }
    }
    View Code

    静态代理类用的不多.主要是使用动态代理

    动态代理 

    /**
     * @Created by xiaodao
     * 接口
     */
    public  interface Star {
    
        void confer();
        void signContract();
        void sing();
    
        void collectMoney();
    
    
    
    }
    /**
     * @Created by xiaodao
     * 接口实现类...
     */
    public class RealStar implements Star {
        public void confer() {
            System.out.println("RealStar.confer");
        }
    
        public void signContract() {
            System.out.println("RealStar.signContract");
    
        }
    
        public void sing() {
            System.out.println("本人唱歌");
    
        }
    
        public void collectMoney() {
            System.out.println("RealStar.collectMoney");
    
        }
    }
    /**
     * @Created by xiaodao
     *
     * 
     */
    public class StarHandler implements InvocationHandler {
    
        private Star star;
    
        public StarHandler(Star star) {
            this.star = star;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            method.invoke(star,args);
            if (method.getName().equals("sing")){
                System.out.println("本人唱歌要加钱");
            }
            return null;
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            Star star = new RealStar();
            StarHandler handler = new StarHandler(star);
    
          Star proxyInstance  =(Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class},handler);
    
          proxyInstance.sing();
          proxyInstance.collectMoney();
        }
    }

    类图

    类图中没有显示.main方法中的proxy类.大家理解下就好. 

    JDK自带的动态代理
    – java.lang.reflect.Proxy
    • 作用:动态生成代理类和对象
    – java.lang.reflect.InvocationHandler(处理器接口)
    可以通过invoke方法实现对真实角色的代理访问。
    • 每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象

  • 相关阅读:
    转:sql语句中GROUP BY 和 HAVING和使用 count()
    shell中的大括号和小括号
    转:关于rename命令ubuntu下的用法
    Linux批量重命名
    STL 源代码剖析 算法 stl_algo.h -- partition
    HDU 5091 线段树扫描线
    IBM 中国研究院面试经历
    当人手一部智能手机时 庞大的数据中心们已死
    Treap的读书笔记2
    【JUnit4.10源码分析】5 Statement
  • 原文地址:https://www.cnblogs.com/bj-xiaodao/p/10841500.html
Copyright © 2011-2022 走看看