zoukankan      html  css  js  c++  java
  • 滴水穿石Java静态代理

    需求:在调用UserManager中的方法之前先调用安全性检查方法
    实现:重新定义一个实现UserManager的类UserManagerImplProxy,定义安全性检查的方法checkSecurity()提供一个持有UserManager实例构造方法,然后在每个方法里面先调用checkSecurity(),然后再用引用去调相关的方法。最后只需要在客户端实例化这个代理即可。

    UserManager.java

    UserManager {
        
        public void addUser(String username,String password);
        
        public void deleteUser(int id);
        
        public void modifyUser(int id,String username,String password);
        
        public String findUserById(int id);
    }

    UserManagerImpl.java

    /**
     * 实现UserManager接口的具体类
     * @author nexiyi
     *
     */
    public class UserManagerImpl implements UserManager {
        public void addUser(String username, String password) {
            System.out.println("UserManagerImpl.addUser()...");
        }
        public void deleteUser(int id) {
            System.out.println("UserManagerImpl.deleteUser()...");
        }
        public String findUserById(int id) {
            System.out.println("UserManagerImpl.findUserById()...");
            return null;
        }
        public void modifyUser(int id, String username, String password) {
            System.out.println("UserManagerImpl.modifyUser()...");
        }
    }

    UserManagerImplProxy .java

    /**
     * 提供一个安全性检查方法:checkSecurity()在每调用增删改查的时候都必须调用该方法
     * @author Administrator
     *
     */
    public class UserManagerImplProxy implements UserManager {
        private UserManager userManager;
        
        public UserManagerImplProxy(UserManager userManager){
            this.userManager = userManager;
        }
        public void addUser(String username, String password) {
            checkSecurity();
            this.userManager.addUser(username, password);
        }
        public void deleteUser(int id) {
            checkSecurity();
            this.userManager.deleteUser(id);
        }
        public String findUserById(int id) {
            checkSecurity();
            this.userManager.findUserById(id);
            return null;
        }
        public void modifyUser(int id, String username, String password) {
            checkSecurity();
            this.userManager.modifyUser(id, username, password);
        }
        
        private void checkSecurity(){
            System.out.println("UserManagerImplProxy.checkSecurity()...");
        }
    }

    Client.java----模拟一个业务逻辑去调用

    public class Client {
        public static void main(String[] args) {
            /*UserManager userManager = new UserManagerImpl();
            userManager.addUser("zhangsan", "111");*/
            UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());
            userManager.addUser("zhangsan", "111");
        }
    }

    运行结果:
    UserManagerImplProxy.checkSecurity()...
    UserManagerImpl.addUser()...
    成功在每个方法之前调用了checkSecurity方法。
    缺点:在每个方法之前都需要调用一下checkSecurity()方法,如果方法数量太多在维护的时候就会很麻烦。

  • 相关阅读:
    CH02 FPGA设计Verilog基础笔记(二)
    同一个按键短按与长按的区别触发
    树莓派 -- 输入设备驱动 (key) 续2: 转载 Setting up a GPIO-Button “keyboard” on a Raspberry Pi
    树莓派 -- 输入设备驱动 (key) 续1
    树莓派 -- 输入设备驱动 (key)
    树莓派 -- 按键 (key)使用BCM2835 gpio library
    leds-gpio driver 续1
    leds-gpio driver
    使用CSDN-markdown编辑器
    树莓派
  • 原文地址:https://www.cnblogs.com/nexiyi/p/2806360.html
Copyright © 2011-2022 走看看