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

    代理模式指某些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    通过代理,控制对对象的访问。

    代理模式核心角色:

      抽象角色:定义代理角色和真实角色的公共对外方法

      真实角色:真正的业务实现

      代理角色: 实现抽象角色,通过对真实角色的业务实现方法来实现抽象方法。也可以新增自己的操作(比如:AOP)

    分类:

      静态代理: 静态代理对象调用的真实对象由自己创建

    /**
     * 定义一个抽象角色
     */
    public interface Star {
        /**
         * 会谈
         */
        void confer();
    
        /**
         * 唱歌
         */
        void sing();
    
        void sing(int a);
    }
    

      

    /**
     * 真实角色
     */
    public class ReadStar implements Star {
        @Override
        public void confer() {
            System.out.println("confer");
        }
    
        @Override
        public void sing() {
            System.out.println("sign");
        }
    
        @Override
        public void sing(int a) {
            System.out.println("sign:"+ a);
        }
    
    }
    

      

    /**
     * 静态代理,真实对象由调用者提供
     */
    public class StaticProxy implements Star {
    
        private ReadStar readStar;
    
        public StaticProxy(ReadStar readStar) {
            this.readStar = readStar;
        }
    
        @Override
        public void confer() {
            readStar.confer();
        }
    
        @Override
        public void sing() {
            readStar.sing();
        }
    
        @Override
        public void sing(int a) {
            readStar.sing(a);
        }
    
    }
    public class Main {
    
        public static void main(String[] args) {
            ReadStar star = new ReadStar();
            Star proxy = new StaticProxy(star);
            proxy.confer();
            proxy.sing();
        }
    }
    

      动态代理:动态代理中,代理类由工具动态生成。常见由jdk动态代理,c'g'lib字节码等。

      JDK动态代理:

        --java.lang.reflect.Proxy:动态生成代理类和对象

        --java.lang.reflect.InvocationHandler(处理器接口):通过invoke方法实现对真实角色的代理访问。

      

    public class StarHandler implements InvocationHandler {
    
        Star realStar;
    
        public StarHandler(Star realStar) {
            super();
            this.realStar = realStar;
        }
    
        /**
         * 调用方法时
         * @param proxy
         * @param method
         * @param args
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            System.out.println("jdk proxy...."+ args);
    
            method.invoke(realStar, args);
    
            return null;
        }
    }
    

      

    public class Main {
        public static void main(String[] args) {
            Star star = new ReadStar();
            StarHandler handler = new StarHandler(star);
    
            Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
                    new Class[]{Star.class}, handler);
            proxy.sing(1);
        }
    }
    

      基于JDK动态代理之能对接口创建代理实例。如果需要对类创建代理,可以采用Cglib字节码方式。

        

      

  • 相关阅读:
    为了实现在线库的复杂查询,你还在双写吗?
    双11核心系统100%上云 !阿里数据库处理峰值远超传统厂商
    每秒8700万次!双11数据库峰值新纪录背后的关键力量
    最强CP!阿里云联手支付宝小程序如何助力双11?
    .net IAsyncResult 异步操作
    .net Reflection(反射)- 二
    .net Reflection(反射)- 一
    .net 空接合操作符 ??
    .net 基元类型,引用类型和值类型
    .net List<T>
  • 原文地址:https://www.cnblogs.com/gcm688/p/10171056.html
Copyright © 2011-2022 走看看