<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    最愛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 閱讀(1129) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

    公告


    導航

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

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩精品免费视频| 日韩黄色免费观看| 国产成人精品日本亚洲11| 精品免费国产一区二区三区| 一级做a爰全过程免费视频毛片| 亚洲成av人片天堂网| 成人激情免费视频| 久久不见久久见免费影院www日本| 亚洲自偷自拍另类图片二区| 免费在线观看理论片| 24小时日本电影免费看| 美女扒开尿口给男人爽免费视频| 亚洲av无码潮喷在线观看| 麻豆国产精品入口免费观看| 花蝴蝶免费视频在线观看高清版 | 亚洲熟妇无码av另类vr影视| 亚洲精品无码av天堂| 久久久久av无码免费网| a毛片成人免费全部播放| 亚洲偷偷自拍高清| 亚洲va无码手机在线电影| 永久久久免费浮力影院| 97视频免费观看2区| 日本一区二区在线免费观看| 亚洲三级中文字幕| 亚洲理论电影在线观看| 国产一区二区三区在线免费观看| 99re6免费视频| 中文字幕免费播放| 久久亚洲精品高潮综合色a片| 777亚洲精品乱码久久久久久 | 一级毛片免费播放试看60分钟| 亚洲女人18毛片水真多| 亚洲精品中文字幕乱码三区| 日本牲交大片免费观看| 4399好看日本在线电影免费| 水蜜桃视频在线观看免费播放高清| 日韩亚洲翔田千里在线| 亚洲av永久无码嘿嘿嘿| 97se亚洲综合在线| 亚洲精品国产字幕久久不卡|