`

设计模式(19)- 享元模式

阅读更多

享元模式

1.定义

      运用共享技术,有效的支持大量细粒度的对象。享元即是共享的对象。

2.示例代码

       对于细粒度的权限对象进行管理,说明享元模式。

/*描述授权数据的享元接口*/
public interface Flyweight{
   /*判断传入的安全实体和权限是否和享元对象内部状态匹配*/
   public boolean match(String securityEntity,String permit);
}

/*封装授权数据中重复出部分的享元对象*/
public class AuthorizationFlyweight implements Flyweight{
    private String securityEntity;
    private String permit;
    //构造方法,传入安全实体和权限数据,以逗号分隔
    public AuthorizationFlyweight(String state){
        String ss[] = state.split(",");
        securityEntity = ss[0];
        permit = ss[1];
    }
    public String getSecurityEntity(){
        return securityEntity;
    }
    public String getPermit(){
        return permit;
    } 
    public boolean match(String securityEntity,String permit){
         if(this.securityEntity.equals(securityEntity) && this.permit.equals(permit)){
              return true;
         }
         return false;
    }
}

/*享元工厂定义,通常实现为单利模式*/
public class FlyweightFactory{
    private static FlyweightFactory factory = new FlyweightFactory();
    private FlyweightFactory(){
    }
    public static FlyweightFactory getInstance(){
       return factory;
    }
    //缓存多个享元对象
    private Map<String,Flyweight> fsMap = new HashMap<String,Flyweight>();
    //获取key对应的享元对象
    public Flyweight getFlyweight(String key){
       Flyweight f = fsMap.get(key);
       if(f == null){
          f = new AuthorizationFlyweight(key);
          fsMap.put(key,f);
       }
    }
}

   

/*定义安全管理类,实现成单利*/
public class SecurityMgr{
    private static SecurityMgr securityMgr = new SecurityMgr();
    private SecurityMgr(){
    }
    public static getInstance(){
        return securityMgr;
    }
    //在运行期间用来存放登陆人员的权限
    private Map<String,Collection<Flyweight>> map = new HashMap<String,Collection<Flyweight>>();
    //模拟用户登陆
    public void login(){
       Colllection<Flyweight> col = queryByUser(user);
       map.put(user,col);
    }
    //判断某个用户对某个安全实体是否有某种权限
    public boolean hasPermit(String user,String securityEntity,String permit){
        Colllection<Flyweight> col = map.get(user);
        if(col == null || col.size() == 0){
            return false;
        }
        for(Flyweight fm:col){
            if(fm.match(securityEntity,permit)){
               return true;
            }
        }
        return false;
    }
    //从数据库中获取某人所有的权限
    private Colllection<Flyweight> queryByUser(){
         Colllection<Flyweight> col= new ArrayList<Flyweight>();
         for(String s : TestDB.colDB){
             String ss[] = s.split(",");
             if(ss[0].equals(user)){
                  Flyweight fm = FlyweightFactory.getInstance().getFlyweight(ss[1],ss[2]);
                  col.add(fm);
             }
         }
         return col;
    }
}

/*模拟数据库运行*/
public class TestDB{
    public static Collection<String> colDB = new ArrayList<String>();
    static{
       colDB.add("张三,人员列表,查看");
       colDB.add("李四,人员列表,查看");
       colDB.add("李四,薪资数据,查看");
       colDB.add("李四,薪资数据,修改");
    }
}

   

/*客户端测试*/
public class Client{
   public static void main(String args[]){
      SecurityMgr mgr = new SecurityMgr();
      mgr.login("张三");
      mgr.login("李四");
      boolean f1 = mrg.hasPermit("张三","薪资数据","查看");
      boolean f2 = mrg.hasPermit("李四","薪资数据","查看");
   }
}

   

3.实际应用

    享元模式的设计重点在于分离变与不变,在享元模式中,为了创建和管理共享的享元部分,引入了享元工厂,在享元工厂中一般都包含有享元对象的实例池。

 

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

相关推荐

    设计模式--C++

    1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第 2 章 实例研究:设计一个文档编辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 272.3 格式化 27 2.3.1 封装格式化...

    Java设计模式-图解-附代码

    1.2.6 享元模式 32 1.2.7 代理模式 34 1.3 行为型模式 37 1.3.1 责任链模式 37 1.3.2 命令模式 40 1.3.3 解释器模式 43 1.3.4 迭代器模式 45 1.3.5 中介者模式 49 1.3.6 备忘录模式 52 1.3.7 观察者模式 54 1.3.8 ...

    C#设计模式.PDF

    C#设计模式(3) 19 三、 依赖倒置原则(DIP) 19 四、 接口隔离原则(ISP) 20 五、 合成/聚合复用原则(CARP) 21 六、 迪米特法则(LoD) 22 C#设计模式(4)-Simple Factory Pattern 24 一、 简单工厂(Simple ...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    7享元模式:共享池模式享元模式:共享池模式 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第8页。 logo 8原型模式:浅拷贝和深度拷贝原型模式:浅拷贝和深度拷贝 设计模式(JAVA语言...

    设计模式:可复用面向对象软件的基础--详细书签版

    1.7 怎样选择设计模式 19 .1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 ...

    研磨设计模式-part2

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    研磨设计模式-part4

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    研磨设计模式-part3

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    研磨设计模式(完整带书签).part2.pdf

    第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...

    C#设计模式大全

    设计模式(19)-Observer Pattern 一、 观察者(Observer)模式 二、 观察者模式的结构 三、 观察者模式的示意性源代码 四、 C#中的Delegate与Event 五、 一个实际应用观察者模式的例子 六、 观察者模式的优...

    设计模式可复用面向对象软件的基础.zip

    1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) ...

    设计模式_源代码大全.zip

    设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    [源代码] 修炼Java开发技术 在架构中体验设计模式和算法之美 (源代码)

    ☆ 资源说明:☆《修炼Java开发技术 在架构中体验设计模式和算法之美》 (随书源代码)☆ 开发环境:☆IntelliJ IDEA 13.1.5 Build 135.1289☆ 章节说明:☆Chapter 02 架构中的设计原则 - (Chapter02.rar)Chapter 03 ...

    Java设计模式整理

    1.2.6 享元模式 21 1.2.7 代理模式 23 1.3 行为型模式 24 1.3.1 责任链模式 25 1.3.2 命令模式 27 1.3.3 解释器模式 28 1.3.4 迭代器模式 30 1.3.5 中介者模式 32 1.3.6 备忘录模式 34 1.3.7 观察者模式 36 1.3.8 ...

    C#设计模式_设计模式_C#_

    享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. ...

    设计模式所有实验及实验报告及代码.zip

    23享元模式 24组合模式 25行为型模式概述 26模板方法模式 27策略模式 28命令模式 29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的...

    设计模式 GOF 23

    1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化...

Global site tag (gtag.js) - Google Analytics