隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 156071
          • 排名 - 389

          最新評論

          [關鍵字]:java,design pattern,設計模式,《Java與模式》學習,Flyweight Pattern,享元模式
          [環境]:StarUML5.0 + JDK6
          [作者]:Winty (wintys@gmail.com) http://wintys.blogjava.net
          [正文]:

          享元模式-復合享元:

          package pattern.flyweight.unsharable;
          import java.util.*;

          /**
           * 復合的享元模式:
           * 復合享元是不能共享的,所以叫Unsharable Flyweight。
           * 但是復合享元是可以分解為可共享的單純享元。
           *
           * @version 2009-6-25
           * @author Winty(wintys@gmail.com)
           */
          public class UnsharableFlyweightTest{
              public static void main(String[] args){
                  FlyweightFactory f = new FlyweightFactory();
                  
                  Flyweight fly = f.factory("aba");
                  fly.operation("ex");

                  f.checkFlyweight();
              }
          }

          /**
           * 抽象享元
           */
          abstract class Flyweight{
              public abstract void operation(String extrinsicState);
          }


          /**
           * 具體享元
           */
          class ConcreteFlyweight extends Flyweight{
              private Character intrinsicState;

              public ConcreteFlyweight(Character intrinsicState){
                  this.intrinsicState = intrinsicState;
              }

              /**
               * 外蘊狀態改變方法行為,但不會改變內蘊狀態
               */
              @Override
              public void operation(String extrinsicState){
                  String str = "intrinsic:" + intrinsicState;
                  str += "   extrinsic:" + extrinsicState;
                  System.out.println(str);
              }
          }


          /**
           * 復合享元
           */
          class UnsharableFlyweight extends Flyweight{
              private Map<Character , Flyweight> map;

              public UnsharableFlyweight(){
                  map = new HashMap<Character , Flyweight>();
              }

              public void add(Character c , Flyweight fly){
                  map.put(c , fly);
              }

              @Override
              public void operation(String extrinsicState){
                  Iterator<Map.Entry<Character , Flyweight>> it
                      = map.entrySet().iterator();
                  while(it.hasNext()){
                      Map.Entry<Character , Flyweight> entry = it.next();
                      Flyweight fly = entry.getValue();
                      fly.operation(extrinsicState);
                  }
              }
          }


          /**
           * 享元工廠
           */
          class FlyweightFactory{
              private Map<Character , Flyweight> map;

              public FlyweightFactory(){
                  map = new HashMap<Character , Flyweight>();
              }

              /**
               * 單純享元工廠
               */
              public Flyweight factory(Character state){
                  Flyweight flyweight = null;

                  if(map.containsKey(state)){
                      flyweight = map.get(state);
                  }
                  else{
                      flyweight = new ConcreteFlyweight(state);
                      map.put(state , flyweight);
                  }

                  return flyweight;
              }

              /**
               * 復合享元工廠
               * 此處Character的復合類型恰好是String,
               * 當無此巧合時,可使用List等聚集類型傳入.
               */
              public Flyweight factory(String compositeState){
                  UnsharableFlyweight composite = new UnsharableFlyweight();
                  
                  for(int i = 0 ; i < compositeState.length(); i++){
                      Character c = new Character(compositeState.charAt(i));
                      composite.add(c , this.factory(c));
                  }

                  return composite;
              }

              /**
               * 輔助方法
               */
              public void checkFlyweight(){
                  Iterator<Map.Entry<Character , Flyweight>> it
                      = map.entrySet().iterator();
                  System.out.println("check flyweight:");
                  while(it.hasNext()){
                      Map.Entry<Character , Flyweight> entry = it.next();
                      Character key = entry.getKey();
                      System.out.println("key:" + key);
                  }
              }
          }


          運行結果:
          intrinsic:b   extrinsic:ex
          intrinsic:a   extrinsic:ex
          check flyweight:
          key:b
          key:a
          posted on 2009-06-29 22:58 天堂露珠 閱讀(1158) 評論(0)  編輯  收藏 所屬分類: Pattern
          主站蜘蛛池模板: 敦化市| 诸城市| 九龙县| 若羌县| 洪洞县| 沙田区| 郑州市| 广河县| 龙江县| 怀化市| 永福县| 阿克苏市| 兴业县| 噶尔县| 内丘县| 涿鹿县| 龙井市| 五河县| 固镇县| 上高县| 沂南县| 洛宁县| 铁岭县| 习水县| 宝丰县| 沙河市| 晋宁县| 枣庄市| 肥东县| 博客| 武宣县| 大丰市| 盈江县| 土默特右旗| 朝阳区| 江山市| 陇南市| 库尔勒市| 临泉县| 东乡县| 高雄市|