最愛Java

          書山有路勤為徑,學海無涯苦作舟

          《AspectJ Cookbook》讀書筆記十七: 實現創建型面向對象設計模式

          一.實現單件模式
                  單件模式允許把類定義成具有應用程序內的一個運行時實例。通常,通過不給特定類提供默認構造函數來實現單件。
          package com.aspectj;

          import java.util.Hashtable;

          public abstract aspect SingletonPattern issingleton(){
              
          private Hashtable singletons = new Hashtable();
              
              
          public interface Singleton{}
              
              
          public interface NonSingleton{}
              
              
          //Pointcut to define specify an interest in all creations
              
          //of all Classes that extend Singleton
              pointcut selectSingletons() : call((Singleton+).new(..));
              
              
          //Pointcut to ensure that any classes in the Singleton inheritance tree
              
          //that are marked as Non Singletons are not included in the Singleton
              
          //logic.
              pointcut excludeNonSingletons():!call((NonSingleton+).new (..));
              
              Object around() : selectSingletons()
          &&excludeNonSingletons() {
                  Class singleton 
          = thisJoinPoint.getSignature().getDeclaringType();
                  
          synchronized(singletons) {
                      
          if (singletons.get(singleton) == null{
                          singletons.put(singleton, proceed());
                      }

                  }

                  
          return (Object) singletons.get(singleton);
              }

          }


                  SingletonPattern抽象方面定義了兩個角色:Singleton和NonSingleton。這些角色被實現為接口,使得抽象方面可以處理單件,而無需關注實現細節。
                  Singleton接口由SingletonPattern抽象方面的子方面應用于目標應用程序內將被視作單件的任何類。類似地,NonSingleton接口被應用于可能通過繼承從其父類獲得單件行為的類。如果決定子類不是一個單件,那么就可以使用NonSingleton接口,使得重寫父類的單件特征。
                  聲明兩個切入點來捕獲何時實例化具有Singleton接口的類。selectSingletons()切入點定義用于選擇對擴展Singleton接口的類上構造函數的調用。為了支持單件子類的關閉單件行為的要求,聲明了excludeNonSingletons()切入點。當需要阻止超類的單件行為影響子類時,可以通過單定的方面重寫這個切入點。
                  around()通知用于捕獲對應用于Singleton接口的類上構造函數的調用。around()通知會重寫構造函數,以檢查尚未創建正在實例化的對象的類型。
                  使用thisJoinPoint變量提供的類的信息,在單件散列表上查詢正在創建的對象的類。如果類的類型在散列表中不存在,那么就添加它的類,并通過調用proceed()來構造那個類的一個對象,這會執行原始的構造函數邏輯。process()調用會返回構造的對象,并把這個對象與類對象一起添加到散列表中。
                  如果散列表中存在類的類型,那么就不需要創建新對象。依據它的類從散列表映射檢索單件對象,并作為構造函數調用的結果從around()通知返回這個對象。
                  以下為如何把SingletonPattern抽象方面應用于特定的應用程序中。
          package com.aspectj;

          public aspect PrinterSingleton extends SingletonPattern {
              declare parents:Printer 
          implements Singleton;
              declare parents:SpecializedPrinter 
          implements NonSingleton;
          }


          二.實現原型模式
                  原型模式支持基于原始對象創建復制的對象。
          package com.aspectj;

          public abstract aspect PrototypePattern {
              
          protected interface Prototype{}
              
              
          public Object Prototype.clone() throws CloneNotSupportedException {
                  
          return super.clone();
              }

              
              
          public Object cloneObject(Prototype object) {
                  
          try {
                      
          return object.clone();
                  }
           catch (CloneNotSupportedException ex) {
                      
          return createCloneFor(object);
                  }

              }

              
              
          protected Object createCloneFor(Prototype object) {
                  
          return null;
              }

          }


              clone()方法是用于實現對象深復制的Java機制。有些基類可能不支持被復制;createCloneFor(Prototype)方法,可以被子方面重新,以執行通用方面不知道的特定復制操作。
          package com.aspectj;

          public aspect GraphicPrototypes extends PrototypePattern {
              declare parents:MyClass 
          implements Prototype;

              declare parents:AnotherClass 
          implements Prototype;

              
          //declare parents:Staff implements Prototype;

              
          protected Object createCloneFor(Prototype object) {
                  
          if (object instanceof MyClass) {
                      
          return  null;
                  }
           else if (object instanceof AnotherClass) {
                      
          return null;
                  }
           else {
                      
          return null;
                  }

              }

          }


          三.實現抽象工廠模式
              抽象工廠模式支持對一組相關類進行實例化,同時把工廠模式的客戶與準確的實現隔離開。
          package com.aspectj;

          public interface ComputerFactory {
              
          public Computer createPentiumProcessorComputer();
              
              
          public Computer createPentiumProcessorComputerWithHardDisk(HardDisk hardDisk);
          }


          package com.aspectj;

          public aspect DefaultComputerFactoryImplementation {
              
              
          public Computer createPentiumProcessorComputer() {
                  Processor processor 
          = new Processor("Pentium 4:9089085043");
                  Motherboard motherboard 
          = new Motherboard("019283" , processor);
                  HardDisk hardDisk 
          = new HardDisk("739874");
                  FloppyDisk floppyDisk 
          = new FloppyDisk("93746");
                  Computer computer 
          = new Computer("12345" , motherboard,hardDisk,floppyDisk);
                  
          return computer;
              }

              
              
          public Computer createPentiumProcessorComputerWithHardDisk(HardDisk hardDisk) {
                  Processor processor 
          = new Processor("Pentium Standard:123478");
                  Motherboard motherboard 
          = new Motherboard("434244" , processor);
                  FloppyDisk floppyDisk 
          = new FloppyDisk("434234");
                  Computer computer 
          = new Computer("56789" , motherboard,hardDisk,floppyDisk);
                  
          return computer;        
              }

              
          }


          四.實現工廠方法模式
          package com.aspectj;

          public aspect DefaultComputerCreatorImplementation {
              
          public void ComputerCreator.createComputerAndPrintInventory(String serial) {
                  System.out.println(
          "Inventory of computerparts:");
                  System.out.println(
          this.createComputer(serial).toString());
              }

          }


          package com.aspectj;

          public aspect DefaultComputerCreatorImplementation {
              
          public void ComputerCreator.createComputerAndPrintInventory(String serial) {
                  System.out.println(
          "Inventory of computerparts:");
                  System.out.println(
          this.createComputer(serial).toString());
              }

          }

          五.實現生成器模式
                  生成器模式用于捕獲在創建對象時可能需要的復雜步驟。這些步驟被實現為生成器類上的方法;在完成每個必須的步驟之后,就可以調用生成器來創建所得到的生成對象。
          package com.aspectj;

          public interface TextPhraseBuilder {
              
          public void buildHeader(String title);
              
              
          public void buildContent(String content);
              
              
          public void buildFooter(String closingContent);
              
              
          public String getResult();
          }

           

          package com.aspectj;

          public aspect TextPhraseBuilderDefaultImplementation {
              
          public StringBuffer TextPhraseBuilder.result = new StringBuffer();
              
              
          public String TextPhraseBuilder.getResult() {
                  
          return result.toString();
              }

              
              
          /**
               * Declares a compiler error that gets reported if other classes
               * (except Builders or this aspect) try to access the result variable.
               
          */

              declare error:(
                      set(
          public StringBuffer TextPhraseBuilder +.result)
                      
          || get(public StringBuffer TextPhraseBuilder +.result))
                      
          && !(within(TextPhraseBuilder +)
                      
          || within(TextPhraseBuilderDefaultImplementation)) :
                          
          "variable result is aspect protected. use getResult() to access it";
          }

          posted on 2008-08-27 11:00 Brian 閱讀(1131) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

          公告


          導航

          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永济市| 宁远县| 黄浦区| 石河子市| 腾冲县| 安仁县| 灵武市| 大连市| 闵行区| 孝义市| 扬州市| 高尔夫| 天柱县| 会东县| 文水县| 略阳县| 新昌县| 高雄市| 尤溪县| 安塞县| 邢台市| 德保县| 化隆| 汝南县| 平利县| 康平县| 尼木县| 合阳县| 化隆| 花莲县| 南皮县| 定兴县| 陈巴尔虎旗| 永昌县| 扎囊县| 礼泉县| 马山县| 望谟县| 瑞金市| 洪江市| 五常市|