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

    动态代理

    以jdk的动态代理为例,简单实现。

    需要的角色:1、抽象主题。 2、真实主题。 3、动态代理的handler。4、动态代理实例proxy。5、业务场景类

    代码清单如下:

    /**
     * 业务场景类
     * @author haokui
     * 
     */
    public class Main {
        
        /**
         * 测试方法
         * @param args
         */
        public static void main(String[] args) {
            
            //定义一个主题
            IGameplay player = new Gameplay();
            
            //定义一个handler
            InvocationHandler handler = new MyInvocationHandler(player);
            
            //定义主题的代理
            IGameplay proxy = DynamicProxy.newProxyInstance(player.getClass().getClassLoader(), player.getClass().getInterfaces(), handler);
            
            //代理的一下行为
            proxy.login("张三");
            proxy.doSomething();
        }
    }
    /**
     * 抽象主题
     * @author haokui
     *
     */
    interface IGameplay {
        /**
         * 主题的一些行为
         */
        void login(String username);
        void doSomething();
    }
    /**
     * 真实主题
     * @author haokui
     *
     */
    class Gameplay implements IGameplay{
    
        @Override
        public void login(String username) {
            System.out.println(username + "登陆成功!");
        }
    
        @Override
        public void doSomething() {
            System.out.println("打游戏中...");
        }
    }
    
    /**
     * 动态代理的handler类
     * @author haokui
     *
     */
    class MyInvocationHandler implements InvocationHandler {
        
        //目标对象,也就是被代理的对象
        private Object target = null;
        
        //通过构造函数传递一个对象
        public MyInvocationHandler(Object obj) {
            this.target = obj;
        }
        
        /**
         * 代理方法
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            
            //如果是登陆,不管是谁登陆,发一个消息通知
            if (method.getName().equalsIgnoreCase("login")) {
                System.out.println("有人在使用朕的账号登陆!");
            }
            //执行被代理的方法
            return    method.invoke(this.target, args);
        }
    }
    /**
     * 动态代理类,产生代理对象
     * @author haokui
     *
     * @param <T>
     */
    class DynamicProxy<T> {
        
        /**
         * 产生代理实例
         * @param <T>
         * @param classLoader
         * @param interfaces
         * @param handler
         * @return
         */
        public static <T> T newProxyInstance(ClassLoader classLoader, Class<?>[] interfaces, InvocationHandler handler) {
            return (T) Proxy.newProxyInstance(classLoader, interfaces, handler);
        }
    }
  • 相关阅读:
    树莓派pwm驱动好盈电调及伺服电机
    wiringPi库的pwm配置及使用说明
    未能加载文件或程序集“**, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
    poj 1700 Crossing River(贪心)
    前缀 树 背单词(Remember the Word,LA 3942)
    c/c++ double的数字 转成字符串后 可以有效的避免精度要求不高的数
    hdu acm 2154(多解取一解)
    hdu 5104 Primes Problem(prime 将三重循环化两重)
    hdu 2203亲和串 (kmp)
    hdu 2519 新生晚会 排列组合
  • 原文地址:https://www.cnblogs.com/hkdpp/p/9634880.html
Copyright © 2011-2022 走看看