生活随笔
收集整理的这篇文章主要介绍了
《研磨设计模式》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)模式介绍的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。