生活随笔
收集整理的這篇文章主要介紹了
《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.享元模式的定義
享元:分離出被緩存對象實(shí)例中,哪些數(shù)據(jù)是不變且重復(fù)出現(xiàn)的,哪些數(shù)據(jù)是經(jīng)常變化的。(內(nèi)部狀態(tài)分離出來共享)
對象的內(nèi)部狀態(tài): 不變且重復(fù)出現(xiàn)的數(shù)據(jù),
對象的外部狀態(tài): 變化的數(shù)據(jù)
- 運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象,通過共享享元對象來減少對內(nèi)存的占用。
- 把外部狀態(tài)分離出來,放到外部,讓應(yīng)用在使用的時(shí)候進(jìn)行維護(hù),并在需要的時(shí)候傳遞給享元對象使用。
享元工廠:為了控制對內(nèi)部狀態(tài)的共享,并且讓外部能簡單地使用共享數(shù)據(jù),提供一個(gè)工廠來管理享元。
public interface Flyweight {//傳入外部狀態(tài) public void
operation(String extrinsicState
);
}public class ConcreteFlyweight implements Flyweight{ private String intrinsicState
;//描述內(nèi)部狀態(tài) public ConcreteFlyweight(String state){this.intrinsicState = state
;}public void operation(String extrinsicState) {//具體的功能處理,可能會(huì)用到享元內(nèi)部、外部的狀態(tài)
}
}
public class UnsharedConcreteFlyweight implements Flyweight{ private String allState
;//描述對象的狀態(tài) public void operation(String extrinsicState) {// 具體的功能處理
}
}public class FlyweightFactory {//緩存多個(gè)flyweight對象,這里只是示意一下 private Map<String,Flyweight> fsMap = new HashMap<String,Flyweight>
();//獲取key對應(yīng)的享元對象 public Flyweight getFlyweight(String key) {//這個(gè)方法里面基本的實(shí)現(xiàn)步驟如下: //1:先從緩存里面查找,是否存在key對應(yīng)的Flyweight對象Flyweight f = fsMap.
get(key
);//2:如果存在,就返回相對應(yīng)的Flyweight對象if(f==null){//3:如果不存在//3.1:創(chuàng)建一個(gè)新的Flyweight對象f = new
ConcreteFlyweight(key
);//3.2:把這個(gè)新的Flyweight對象添加到緩存里面fsMap.
put(key,f
);//3.3:然后返回這個(gè)新的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+
"沒有登錄或是沒有被分配任何權(quán)限");return false
;}for(Flyweight fm : col){//輸出當(dāng)前實(shí)例,看看是否同一個(gè)實(shí)例對象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){//登錄的時(shí)候就需要把該用戶所擁有的權(quán)限,從數(shù)據(jù)庫中取出來,放到緩存中去Collection<Flyweight> col =
queryByUser(user
);map.
put(user, col
);}public static void main(String[] args) throws Exception{//需要先登錄,然后再判斷是否有權(quán)限SecurityMgr mgr = SecurityMgr.
getInstance();mgr.
login("張三");mgr.
login("李四"); boolean f1 = mgr.
hasPermit("張三",
"薪資數(shù)據(jù)",
"查看");boolean f2 = mgr.
hasPermit("李四",
"薪資數(shù)據(jù)",
"查看"); System.out.
println("f1=="+f1
);System.out.
println("f2=="+f2
);for(int i=0
;i<3
;i++){mgr.
login("張三"+i
);mgr.
hasPermit("張三"+i,
"薪資數(shù)據(jù)",
"查看");}}
總結(jié)
以上是生活随笔為你收集整理的《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。