享元模式的实例

it2025-02-14  8

     好了,废话不多说,直接上代码,首先抽象一个场景:

        公司的管理层和普通员工对员工的信息有不同的权限。管理层可以修改员工的个人信息,普员工只能查看不能修改,擅自修改系统会给出提示。员工的个人信息是可以共享的,但是起职能范围和操作权限可以被管理层修改。

抽象享元角色:

 

[java]   public interface IFlyWeight {            /**     * 判断传入的安全实体和权限,是否和享元对象内部状态匹配     * 参数 securityEntity 和 permit 是外蕴对象     * @param securityEntity      * @param permit     * @return     */      public boolean match(String securityEntity, String permit);    }  

具体享元角色:

 

 

[java]   public class AuthorizationFlyweight implements IFlyWeight {      /**      * 内蕴对象,安全实体      */      private String mSecurityEntity;      /**      * 内蕴对象,权限      */      private String mPermit;        public AuthorizationFlyweight(String state) {          String str[] = state.split(",");          this.mSecurityEntity = str[0];          this.mPermit = str[1];      }        @Override      public boolean match(String securityEntity, String permit) {          if (mSecurityEntity.equals(securityEntity) && mPermit.equals(permit)) {              return true;          }          return false;      }    }  

享元工厂:

 

 

[java]   public class FlyWeightFactory {      private static FlyWeightFactory mFactory = new FlyWeightFactory();        private FlyWeightFactory() {        }        public static FlyWeightFactory getInstance() {          return mFactory;      }        /**      * 缓存多个人IFlyWeight 对象      */      private Map<String, IFlyWeight> flyMap = new HashMap<String, IFlyWeight>();        /**      * 获取享元单元      * @param key      * @return      */      public IFlyWeight getFlyWeight(String key) {          IFlyWeight fly = flyMap.get(key);          if(fly==null){              fly = new AuthorizationFlyweight(key);              flyMap.put(key, fly);          }          return fly;      }  }  

员工信息的管理工具:

 

 

[java]   public class SecurityManager {      private static SecurityManager manager = new SecurityManager();        private SecurityManager() {        }        public static SecurityManager getInstance() {          return manager;      }        /**      * 存放登录人员的权限      */      private Map<String, Collection<IFlyWeight>> map = new HashMap<String, Collection<IFlyWeight>>();        public void logon(String user) {          Collection<IFlyWeight> coll = queryByUser(user);          map.put(user, coll);      }        /**      * 从数据库中获取某人所有的权限      *       * @param user      * @return      */      private Collection<IFlyWeight> queryByUser(String user) {          Collection<IFlyWeight> coll = new ArrayList<IFlyWeight>();          for (String s : TestDB.coll) {              String str[] = s.split(",");              if (str[0].equals(user)) {                  IFlyWeight fly = FlyWeightFactory.getInstance().getFlyWeight(                          str[1] + "," + str[2]);                  coll.add(fly);              }          }          return coll;      }        /**      * 判断某个用户对某个安全实体是否有某种权限      *       * @param user      *            用户      * @param securityEntity      *            安全实体      * @param permit      *            权限      * @return      */      public boolean hasPermit(String user, String securityEntity, String permit) {          Collection<IFlyWeight> coll = map.get(user);          if (coll == null || coll.size() == 0) {              System.out.println(user + "没有登录或者没有该权限...");              return false;          }            for (IFlyWeight fly : coll) {              if (fly.match(securityEntity, permit)) {                  return true;              }          }            return false;      }  }  

模拟一个数据库保存员工信息:

 

 

[java]   public class TestDB {        public static Collection<String> coll = new ArrayList<String>();        static {          coll.add("张三,人员列表,查看");          coll.add("李四,人员列表,查看");          coll.add("李四,薪资列表,查看");          coll.add("李四,薪资列表,修改");            for (short i = 0; i < 3; i++) {              coll.add("张三" + i + ",人员列表,查看");          }      }  }  

具体的实现,本例子是基于android实现的,java只单独写一个Test类在main里面实现就行了:

 

 

[java]  view plain copy   SecurityManager manager = SecurityManager.getInstance();  manager.logon("张三");  manager.logon("李四");                    boolean b1 = manager.hasPermit("张三", "薪资列表", "查看");  boolean b2 = manager.hasPermit("李四", "薪资列表", "查看");  boolean b3 = manager.hasPermit("张三", "人员列表", "查看");  System.out.println("b1 = "+b1);  System.out.println("b2 = "+b2);  System.out.println("b3 = "+b3);  

运行效果:

 

         

从数据库中可以看出来,张三是人事的普通员工,只能查看公司在职人员,对员工的薪资无权限查看,b1返回false,b3返回true

李四是人事普通员工兼财务主管,可以修改查询员工薪资并且可以查看在职员工信息,b2返回true

如果    

[java]   boolean b4 = manager.hasPermit("王武", "人员列表", "查看");  

因为“王武”这个人没有登录,所以提示信息是  “没有登录或者没有该权限...”

转载于:https://www.cnblogs.com/w-wfy/p/5354275.html

相关资源:享元模式.md
最新回复(0)