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

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

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

    最愛Java

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

    《AspectJ Cookbook》讀書筆記十七: 實現(xiàn)創(chuàng)建型面向?qū)ο笤O(shè)計模式

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

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


    二.實現(xiàn)原型模式
            原型模式支持基于原始對象創(chuàng)建復制的對象。
    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()方法是用于實現(xiàn)對象深復制的Java機制。有些基類可能不支持被復制;createCloneFor(Prototype)方法,可以被子方面重新,以執(zhí)行通用方面不知道的特定復制操作。
    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;
            }

        }

    }


    三.實現(xiàn)抽象工廠模式
        抽象工廠模式支持對一組相關(guān)類進行實例化,同時把工廠模式的客戶與準確的實現(xiàn)隔離開。
    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;        
        }

        
    }


    四.實現(xiàn)工廠方法模式
    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());
        }

    }

    五.實現(xiàn)生成器模式
            生成器模式用于捕獲在創(chuàng)建對象時可能需要的復雜步驟。這些步驟被實現(xiàn)為生成器類上的方法;在完成每個必須的步驟之后,就可以調(diào)用生成器來創(chuàng)建所得到的生成對象。
    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

    統(tǒng)計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 999任你躁在线精品免费不卡| 一本久久A久久免费精品不卡 | 亚洲成A人片在线播放器| 亚洲精品免费在线观看| 亚洲免费在线播放| 2022久久国产精品免费热麻豆| 亚洲精品视频在线观看视频| 91麻豆最新在线人成免费观看| 亚洲伊人久久大香线蕉影院| 毛片高清视频在线看免费观看| 亚洲一本到无码av中文字幕| 国产成人高清精品免费软件 | 暖暖免费在线中文日本| 亚洲成av人在线视| 免费福利视频导航| 亚洲午夜精品久久久久久app| 国产免费牲交视频| 91av免费在线视频| 精品日韩亚洲AV无码| 最近中文字幕无免费视频| 精品国产_亚洲人成在线| 国产亚洲成归v人片在线观看| 日本在线看片免费| 性xxxx黑人与亚洲| 亚洲精品无码你懂的网站| 久久精品视频免费| 学生妹亚洲一区二区| 免费一级毛片在线播放| 国产午夜无码片免费| 亚洲一本之道高清乱码| 亚洲精品无码你懂的网站| 免费能直接在线观看黄的视频| 国产天堂亚洲国产碰碰| 亚洲一区影音先锋色资源| 成人毛片18女人毛片免费96 | 亚洲爆乳精品无码一区二区三区| 久久久久久精品成人免费图片| 粉色视频免费入口| 亚洲第一香蕉视频| 亚洲熟妇少妇任你躁在线观看无码| 久久国产色AV免费看|