日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2025/3/21 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《研磨设计模式》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)模式介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。