`

设计模式(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.实际应用

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

 

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

相关推荐

    设计模式精解-GoF 23种设计模式

    GoF(Gang of Four)23种设计模式是业界广泛认可的经典设计模式集合,由《设计模式:可复用面向对象软件的基础》一书中的四位作者提出。这些模式分为创建型、结构型和行为型三大类,涵盖了多种软件设计原则和技巧,...

    HeadFirst设计模式(深入浅出设计模式)-高清

    《HeadFirst设计模式》是一本深受开发者喜爱的经典书籍,它以独特的方式深入浅出地讲解了设计模式这一重要编程概念。设计模式是软件工程中经过实践验证的、解决常见问题的有效解决方案,对于提升代码可读性、可维护...

    设计模式精解-GoF 23 种设计模式解析附 C++实现

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题,提供了一套可重用的解决方案。这些模式都是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称作“Gang of ...

    设计模式2-结构型模式&设计模式基本原则

    设计模式是软件开发中的一种重要概念,用于解决常见的设计问题并提供可重用的解决方案。在本文中,我们将深入探讨结构型模式以及设计模式的基本原则。 结构型模式是设计模式的一种类别,它关注如何组合类和对象以...

    设计模式C#-Code版

    在软件开发领域,设计模式是经验丰富的开发者们总结出的解决常见问题的模板或最佳实践。C#作为一款广泛应用于企业级开发的编程语言,其社区对于设计模式的应用有着丰富的资源。"设计模式C#-Code版"这个压缩包文件...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    10. **享元模式(Flyweight)** - 为了支持大量细粒度的对象,共享对象来减少内存使用。C++中可以使用指针和智能指针来实现共享。 11. **代理模式(Proxy)** - 为其他对象提供一种代理以控制对这个对象的访问。C++...

    设计模式精解-需要的可以看看

    19. 享元模式:运用共享技术有效地支持大量细粒度的对象,减少内存开销。 20. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的原始状态。 21. 观察...

    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 ...

    Head.First设计模式--22~39.rar.pdf (C#)

    《Head.First设计模式》是软件开发领域中一本非常受欢迎的书籍,它以通俗易懂的方式讲解了设计模式这一复杂的主题。在22到39章节中,作者深入浅出地探讨了多个关键的设计模式,这些模式对于使用C#进行软件开发的...

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...

    C#设计模式.PDF

    根据提供的文档概览,我们可以对每个章节所涉及的设计模式进行详细的阐述和解释。下面将针对文档中提及的设计模式逐一展开,以便更好地理解这些模式的概念、结构、应用场景以及优缺点。 ### 1. 面向对象程序设计...

    设计模式-java实现代码汇总

    11. 享元模式(Flyweight):有效地使用共享对象,减少内存中的对象数量。 12. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 **行为型设计模式**: 13. 责任链模式(Chain of ...

    总结23种设计模式-极客学院-课件及源码

    在本资源中,“总结23种设计模式-极客学院-课件及源码”,提供了全面的设计模式学习资料,包括课件和源代码示例,帮助开发者深入理解和应用这些模式。以下是对这23种设计模式的详细概述: 1. **单例模式**:确保一...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。在Java编程中,设计模式的应用极大地提高了代码的可读性、可维护性和可复用性。《设计模式——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 ...

    设计模式实例源码

    这个压缩包文件名为“23种设计模式示例源码”,暗示其中包含了解决23种经典设计模式的具体实现代码,这对于初学者或者希望深入理解设计模式的开发者来说是一份宝贵的资源。下面将对这23种设计模式进行详细解释。 1....

    23种设计模式-简单通俗的代码解释

    这个压缩包文件名为"23种设计模式-简单通俗的代码解释",表明它包含了一个全面的23个经典设计模式的代码实现,这些模式都是为了提高代码的健壮性和可扩展性。下面将对这23种设计模式进行详细阐述: 1. **单例模式**...

    C#面向对象设计模式纵横谈(25):设计模式总结

    11. 享元模式:享元模式通过共享技术有效地支持大量细粒度的对象,减少内存消耗。 12. 代理模式:代理模式为其他对象提供一种代理以控制对这个对象的访问,可以实现远程代理、虚拟代理和保护代理。 13. 模板方法...

    C#23种设计模式【完整】.pdf

    11. 享元模式(Flyweight Pattern):使用共享技术来最小化对象的存储空间,避免大量相同对象的创建。 12. 代理模式(Proxy Pattern):为其他对象提供一个代理,以控制对这个对象的访问。 13. 模板方法模式...

Global site tag (gtag.js) - Google Analytics