欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍

发布时间:2025/3/21 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.享元模式的定义

享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的。(内部状态分离出来共享)

对象的内部状态: 不变且重复出现的数据,
对象的外部状态: 变化的数据

  • 运用共享技术有效地支持大量细粒度的对象,通过共享享元对象来减少对内存的占用。
  • 把外部状态分离出来,放到外部,让应用在使用的时候进行维护,并在需要的时候传递给享元对象使用。

享元工厂:为了控制对内部状态的共享,并且让外部能简单地使用共享数据,提供一个工厂来管理享元。


public interface Flyweight {//传入外部状态 public void operation(String extrinsicState); }public class ConcreteFlyweight implements Flyweight{ private String intrinsicState;//描述内部状态 public ConcreteFlyweight(String state){this.intrinsicState = state;}public void operation(String extrinsicState) {//具体的功能处理,可能会用到享元内部、外部的状态} } public class UnsharedConcreteFlyweight implements Flyweight{ private String allState;//描述对象的状态 public void operation(String extrinsicState) {// 具体的功能处理} }public class FlyweightFactory {//缓存多个flyweight对象,这里只是示意一下 private Map<String,Flyweight> fsMap = new HashMap<String,Flyweight>();//获取key对应的享元对象 public Flyweight getFlyweight(String key) {//这个方法里面基本的实现步骤如下: //1:先从缓存里面查找,是否存在key对应的Flyweight对象Flyweight f = fsMap.get(key);//2:如果存在,就返回相对应的Flyweight对象if(f==null){//3:如果不存在//3.1:创建一个新的Flyweight对象f = new ConcreteFlyweight(key);//3.2:把这个新的Flyweight对象添加到缓存里面fsMap.put(key,f);//3.3:然后返回这个新的Flyweight对象}return f;} }public class SecurityMgr {private Map<String,Collection<Flyweight>> map = new HashMap<String,Collection<Flyweight>>();public boolean hasPermit(String user,String securityEntity,String permit){Collection<Flyweight> col = map.get(user);if(col==null || col.size()==0){System.out.println(user+"没有登录或是没有被分配任何权限");return false;}for(Flyweight fm : col){//输出当前实例,看看是否同一个实例对象System.out.println("fm=="+fm);if(fm.match(securityEntity, permit)){return true;}}return false;}private Collection<Flyweight> queryByUser(String user){Collection<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 void login(String user){//登录的时候就需要把该用户所拥有的权限,从数据库中取出来,放到缓存中去Collection<Flyweight> col = queryByUser(user);map.put(user, col);}public static void main(String[] args) throws Exception{//需要先登录,然后再判断是否有权限SecurityMgr mgr = SecurityMgr.getInstance();mgr.login("张三");mgr.login("李四"); boolean f1 = mgr.hasPermit("张三","薪资数据","查看");boolean f2 = mgr.hasPermit("李四","薪资数据","查看"); System.out.println("f1=="+f1);System.out.println("f2=="+f2);for(int i=0;i<3;i++){mgr.login("张三"+i);mgr.hasPermit("张三"+i,"薪资数据","查看");}}

总结

以上是生活随笔为你收集整理的《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。