- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设计模式举例
享元模式举例 给系统加入权限控制 对于应用系统来言,一般先要登录系统,才可以使用系统的功能。登陆后,用户的每次操作都需要经过权限系统的控制,确保用户有操作该功能的权限,同时还要控制该用户对数据的访问权限、修改权限等。 权限系统基本知识 安全实体:就是被权限系统检测的对象,比如工资数据 权限:就是需要被校验的权限对象,比如查看、修改等 安全实体和权限通常要一起描述才有意义 授权:把对某些安全实体的某些权限分配给某些人员的过程 验证:是判断某个人员对某个安全实体是否拥有某个或某些权限的过程 在目前系统开发中,多数是利用数据库来存放授权过程产生的数据。也就是说,授权是向数据库中添加数据,或是维护数据的过程,而验证过程就变成了从数据库中获取相应数据进行匹配的过程。 问题 张三 对 人员列表 拥有 查看的权限 李四 对 人员列表 拥有 查看的权限 李四 对 薪资数据 拥有 查看的权限 李四 对 薪资数据 拥有 修改的权限 假设在某极端情况下,要把“人员列表”这个安全实体的查看权限限制授权给一万个人,那么数据库中将会有一万条记录,会有一万个对象实例,而在这些实例中,有大部分的数据是重复的,而且会重复一万次??? 分析 上面内容中,有些数据是重复出现的,比如:人员列表、薪资数据、查看、修改等。 造成内存浪费的主要原因:就是细粒度对象太多,而且有大量重复的数据。 使用享元模式 把安全实体和权限的描述定义为享元 人员数据作为享元的外部数据 供测试用,在内存中模拟数据库中的值 public class TestDB { /** * 用来存放授权数据的值 */ public static CollectionString colDB = new ArrayListString(); static{ //通过静态块来填充模拟的数据 colDB.add(张三,人员列表,查看); colDB.add(李四,人员列表,查看); colDB.add(李四,薪资数据,查看); colDB.add(李四,薪资数据,修改); //增加更多的授权数据 for(int i=0;i3;i++){ colDB.add(张三+i+,人员列表,查看); } } } 给享元定义一个接口 public interface Flyweight { /** * 判断传入的安全实体和权限,是否和享元对象内部状态匹配 * @param securityEntity 安全实体 * @param permit 权限 * @return true表示匹配,false表示不匹配 */ public boolean match(String securityEntity,String permit); } 实现享元对象,这个对象需要封装授权数据中重复出现部分的数据 public class AuthorizationFlyweight implements Flyweight{ /** * 内部状态,安全实体 */ private String securityEntity; /** * 内部状态,权限 */ private String permit; /** * 构造方法,传入状态数据 * @param state 状态数据,包含安全实体和权限的数据,用,分隔 */ 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 st
文档评论(0)