java设计模式享元模式.doc_第1页
java设计模式享元模式.doc_第2页
java设计模式享元模式.doc_第3页
java设计模式享元模式.doc_第4页
java设计模式享元模式.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java 设计模式享元模式享元模式的结构享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分内蕴状态(Internal State) 和外蕴状态 (External State)。一个内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。一个外蕴状态是随环境的改变而改变的、不可以共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。享元模式的优点:减少对象数量,节

2、省内存空间。享元模式的缺点:维护共享对象,需要额外的开销(用一个线程来维护垃圾回收)。享元模式的本质:分离与共享何时使用享元模式:如果一个应用程序使用了大量的细粒度对象,可以使用享元模式来减少对象数量。如果使用大量的对象,造成很大的存储开销,可以使用享元模式来减少对象数量,并节约内存。如果对象的大多数状态都可以转变为外部状态,可以使用享元对象来实现外部状态与内部状态的分离。 享元模式可以分成单纯享元模式和复合享元模式两种形式。单纯享元模式在单纯的享元模式中,所有的享元对象都是可以共享的。单纯享元模式所涉及到的角色如下:抽象享元 (Flyweight) 角色:给出一个抽象接口,以规定出所有具体享

3、元角色需要实现的方法。具体享元(ConcreteFlyweight) 角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元工厂 (FlyweightFactory) 角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创 建一个合适的享元对象。好了,废话不多说,直接上代码,首先抽象一个场景:公司的管理层和普通员工对员工

4、的信息有不同的权限。管理层可以修改员工的个人信息,普员工只能查看不能修改,擅自修改系统会给出提示。员工的个人信息是可以共享的,但是起职能范围和操作权限可以被管理层修改。抽象享元角色:javapublic interface IFlyWeight /* 判断传入的安全实体和权限,是否和享元对象内部状态匹配* 参数 securityEntity 和 permit 是外蕴对象 * param securityEntity * param permit * return */ public boolean match(String securityEntity, String permit); 具体享

5、元角色:javapublic class AuthorizationFlyweight implementsIFlyWeight /* 内蕴对象,安全实体*/private String mSecurityEntity;/*内蕴对象,权限*/private String mPermit;publicAuthorizationFlyweight(String state) String str =state.split(,);this.mSecurityEntity = str0;this.mPermit = str1;Overridepublic boolean match(String se

6、curityEntity, String permit)if (mSecurityEntity.equals(securityEntity)&& mPermit.equals(permit) returntrue;return false; 享元工厂:javapublic class FlyWeightFactory private staticFlyWeightFactory mFactory = new FlyWeightFactory();private FlyWeightFactory() public staticFlyWeightFactory getInstanc

7、e() returnmFactory;/*缓存多个人IFlyWeight对象*/private Map<String,IFlyWeight> flyMap = new HashMap<String,IFlyWeight>();/*获取享元单元* param key* return*/publicIFlyWeight getFlyWeight(String key) IFlyWeightfly = flyMap.get(key);if(fly=null)fly = newAuthorizationFlyweight(key);flyMap.put(key,fly);ret

8、urn fly;员工信息的管理工具:javapublic class SecurityManager private staticSecurityManager manager = new SecurityManager();private SecurityManager() public staticSecurityManager getInstance() returnmanager;/*存放登录人员的权限*/private Map<String,Collection<IFlyWeight>> map = newHashMap<String, Collecti

9、on<IFlyWeight>>();public void logon(String user)Collection<IFlyWeight> coll =queryByUser(user);map.put(user, coll);/*从数据库中获取某人所有的权限* param user* return*/privateCollection<IFlyWeight> queryByUser(String user)Collection<IFlyWeight> coll = newArrayList<IFlyWeight>();for

10、 (String s :TestDB.coll) String str = s.split(,);if (str0.equals(user) IFlyWeight fly =FlyWeightFactory.getInstance().getFlyWeight(str1 + , + str2);coll.add(fly);returncoll;/* 判断某个用户对某个安全实体是否有某种权限* param user*用户* param securityEntity*安全实体* param permit*权限* return*/public boolean hasPermit(String use

11、r,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) returntrue;returnfalse;模拟一个数据库保存员工信息:javapublic class TestD

12、B public staticCollection<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 里面

13、实现就行了:java view plaincopySecurityManager 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);运行效果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论