A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 亦金亦水 中级黑马   /  2014-7-16 15:00  /  1128 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过学习,对享元设计模式不太了解,那么现在整理如下内容:

享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。

        享元模式的优点:减少对象数量,节省内存空间。

        享元模式的缺点:维护共享对象,需要额外的开销(用一个线程来维护垃圾回收)。

        享元模式的本质:分离与共享



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

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

抽象享元角色:


[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 plaincopy

  • 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("王武", "人员列表", "查看");

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



-------android培训JAVA培训、期待与您交流! ----------

--------详细请查看www.itheima.com-------------


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马