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

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

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

    回歸

    驀然回首,那人卻在燈火闌珊處

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      4 Posts :: 2 Stories :: 12 Comments :: 0 Trackbacks

    2007年7月27日 #

     

             前些時(shí)工作忙,中間停頓一段時(shí)間,今天繼續(xù)。向關(guān)注這里的文章的博友們表示抱歉。
             今天說說一個(gè)簡單的模式,迭代器模式(Iterator),他屬于行為模式中的一種。

             [形成]

             在Java程序中,在輸出List類型的對(duì)象時(shí)候,出現(xiàn)最多的程式塊就是:
             

    1     for (int i = 0 ;i<list.size; i++){
    2         XXX x = (XXX)list.get(i);
    3     }

     

    其中l(wèi)ist 是List 類型,里邊放著若干個(gè)XXX類型的對(duì)象。
    這種 方式是采用i++遞增的方式來遍歷list中的所有對(duì)象來進(jìn)行相關(guān)操作。對(duì)于設(shè)計(jì)模式,把i的功能抽象劃的結(jié)果就是:Iterator Pattern

    Iterate 中文的意思是“迭代,反復(fù)”,Iterator 的意思可以理解為“迭代器”。

           [代碼示例]
            示例程式是把書(Book)放到書架上(BookShelf)上,并依次輸出書名。
             
             程式列表
       
    名稱 說明
    Aggregate 表示已聚合的接口
    Iterator 執(zhí)行遞增,遍歷的接口
    Book 表示書籍的類
    BookShelf 表示書架的類
    BookShelfIterator 掃描書架的類
    Main 測試用的類

       
              










    [UML圖]






          [示例代碼和類的詮釋]

    1 package Iterator;
    2 
    3 import java.util.Iterator;
    4 
    5 public interface Aggregate {
    6     public abstract Iterator iterator();
    7 }
    8 

    Aggregate 接口:
         該接口只聲明了一個(gè)方法,建立一個(gè)可以對(duì)應(yīng)聚合的Iterator.,當(dāng)需要遍歷某個(gè)聚合對(duì)象時(shí),調(diào)用Iterator方法可以建立一個(gè)實(shí)現(xiàn)Iterator接口的類的對(duì)象實(shí)例。

    1 package Iterator;
    2 
    3 public interface Iterator {
    4     public abstract boolean hasNext();
    5     public abstract Object next();
    6 }
    7 

    Iterator 接口:
    這是該模式的核心接口,Iterator接口執(zhí)行元素的遞增,具有循環(huán)遍歷的功能。Iterator的接口的方法因需要而定,我們可以初步確定接口方法:
    hasNext() :是檢查有沒有“下一個(gè)元素”,返回boolean.(有,返回true,,無,返回false)
    next();取得“下一個(gè)元素”,同時(shí)把取對(duì)象的指針指向下一個(gè)元素,以便下次調(diào)用next方法的時(shí)候確實(shí)能取到下一個(gè)元素。這些具體實(shí)現(xiàn)還得看具體的實(shí)現(xiàn)Iterator接口的類的實(shí)現(xiàn)才知道

     1 package Iterator;
     2 
     3 public class Book {
     4     private String name = "";
     5 
     6     public Book(String name) {
     7         this.name = name;
     8     }
     9 
    10     public String getName() {
    11         return name;
    12     }
    13 }
    14 

    Book 類:
    表示書籍的類,比較簡單,通過getName方法得到書的名字,書名是以構(gòu)造函數(shù)初始化對(duì)象的時(shí)候用參數(shù)來字號(hào)定。


     1 package Iterator;
     2 
     3 public class BookShelf implements Aggregate{
     4     private Book[] books;
     5     private int last = 0;
     6     
     7     public BookShelf(int maxsize){
     8         this.books = new Book[maxsize];
     9     }
    10         
    11     public Book getBookAt(int index){
    12         return books[index];
    13     }
    14     public void appendBook(Book book){
    15         this.books[last] = book;
    16         last++;
    17     }
    18     
    19     public int getLength(){
    20         return last;
    21     }
    22     public Iterator iterator(){
    23         return new BookShelfIterator(this);
    24     }
    25 }
    26 


    BookShelfl類:
         該類是表現(xiàn)書架作用的類,保證實(shí)現(xiàn)Aggregate接口所聲明的Iterator方法里返回實(shí)現(xiàn)Iterator接口的實(shí)例。如果需要遍歷書架上的書,調(diào)用iterator方法。books數(shù)組存放的對(duì)象就是book,書架大小可以在一開始建立時(shí)設(shè)置大小,當(dāng)然我們可以不用數(shù)組而采用java.util.Vector,就可以往書架上放超過指定數(shù)量的書籍。


     1 package Iterator;
     2 
     3 public class BookShelfIterator implements Iterator{
     4     private BookShelf bookShelf;
     5     private int index;
     6     public BookShelfIterator(BookShelf bookShelf){
     7         this.bookShelf = bookShelf;
     8         this.index =0;
     9     }
    10     
    11     public boolean hasNext(){
    12         if(index < bookShelf.getLength()){
    13             return true;
    14         }else{
    15             return false;
    16         }
    17     }
    18     
    19     public Object next(){
    20         Book book = bookShelf.getBookAt(index);
    21         index++;
    22         return book;
    23     }
    24 
    25 }
    26 

    BookShelfIterator類:

          字段bookShelf指定BookShelfIterator所要掃描的書架,而index字段則是指向目前該書的下標(biāo)。
          構(gòu)造函數(shù)把傳過來的BookShelf對(duì)象實(shí)例儲(chǔ)存在bookShelf字段,將index設(shè)置為0.
          實(shí)現(xiàn)的hasNext方法判斷是否有下一本書的標(biāo)準(zhǔn)是根據(jù)index是否小于書架上書籍的數(shù)量(表達(dá)式bookShelf.getLength()的值)來判斷。
          next方法返回目前該書,并進(jìn)入到“下一個(gè)”。兩步:第一步先把取得當(dāng)面的書籍保留在book變量,然后把循環(huán)變量推到“下一個(gè)”。


     1 package Iterator;
     2 
     3 public class Main {
     4     /**
     5      * @param args
     6      */
     7     public static void main(String[] args) {
     8         BookShelf bookShelf = new BookShelf(3);
     9         bookShelf.appendBook(new Book("book1"));
    10         bookShelf.appendBook(new Book("book2"));
    11         bookShelf.appendBook(new Book("book3"));
    12         Iterator it  = bookShelf.iterator();
    13         while(it.hasNext()){
    14             Book book = (Book)it.next();
    15             System.out.println(" "+book.getName());
    16         }
    17     }
    18 
    19 }
    20 

    Main類:
         1.先放三本書上架
          2.通過調(diào)用書架的iterator方法得到迭代器,來進(jìn)行循環(huán)遍歷
          3.循環(huán)遍歷書籍,取出書,打印出書的名字。


    示例程序的執(zhí)行結(jié)果 book1
     book2
     book3

    回顧一下,在迭代器模式中幾個(gè)重要“角色”:
         迭代器: 定義了訪問和遍歷元素的接口 ,它定義了能否取得下一個(gè)元素信息的的hasNext方法和取得下一個(gè)元素的next方法
        具體的迭代器:實(shí)現(xiàn)了迭代器的接口,如本例的BookShelfIterator,掌握遍歷時(shí)的重要信息。
        聚合:定義了建立了Iterator的接口。如本例的:Aggregate接口,定義了Iterator方法
       具體聚合:實(shí)現(xiàn)了聚合的所定義的接口,如本例的BookShelf,它實(shí)現(xiàn)了Iterator方法。


          [拓展思考]
           有人回想,干嘛搞這么麻煩,用一個(gè)for不就是可以遍歷數(shù)組或List碼?思考一下迭代器的結(jié)構(gòu)。Iterator是把定義和實(shí)現(xiàn)分開

            while(it.hasNext()){
                               Book book = (Book)it.next();
                            System.out.println(" "+book.getName());
              }
          這里我只調(diào)用了Iterator接口的hasNext和next方法,并沒有調(diào)用BookShelf實(shí)現(xiàn)遍歷是需要的方法,如:getBookAt()。這里的while不會(huì)收到BookShelf的實(shí)現(xiàn)影響。
          假設(shè)這里我們不采用數(shù)組來管理BookShelf,而采取與Java.util.Vector來管理。無論BookShelf的如何修改,都Main測試程序里無需修改任何程序就可以運(yùn)行,這就是設(shè)計(jì)模式的優(yōu)勢。設(shè)計(jì)模式是為了提高類的服用率,如果把一個(gè)零件修改了,就不想要修改其他使用了改零件的部分。

     
    posted @ 2007-07-27 15:22 回歸 閱讀(1192) | 評(píng)論 (2)編輯 收藏

    2007年6月8日 #

          現(xiàn)在大多數(shù)Java軟件工程師面試都會(huì)問到這個(gè)問題:什么是單例模式(Singleton),能否寫出單例模式的示例代碼?單例模式是Gof中23個(gè)模式中最簡單最容易入門的模式,學(xué)習(xí)它我們能更理性的感知模式的意義.

         [形成]

          Singleton Pattern 為什么會(huì)出現(xiàn)?在我們軟件開發(fā)和架構(gòu)中,經(jīng)常遇到這樣的情形:我們需要一個(gè)類只能且僅能產(chǎn)生一個(gè)實(shí)例..比如表示一臺(tái)計(jì)算機(jī)的類,表示系統(tǒng)設(shè)定的類或者是表示窗口的類,還有為了節(jié)約資源,只讓產(chǎn)生一個(gè)實(shí)例..
         
          如何構(gòu)造這種情形?Singleton模式給我一個(gè)方案:


         [代碼示例]
          
          程序列表
       

    名稱

    說明

    Singleton

    只有一個(gè)對(duì)象實(shí)例的類

    Main

    測試用的類



          [UML圖]
       
          

    [示例代碼和類的詮釋]

     1 package singleton;
     2 
     3 public class Singleton {
     4     private static Singleton singleton = new Singleton();
     5 
     6     private Singleton() {
     7         System.out.println("Create instance...");
     8     }
     9 
    10     public static Singleton getInstance() {
    11         return singleton;
    12     }
    13 }
    14 


              Singleton  Class:
                
                1.該類只能產(chǎn)生一個(gè)對(duì)象實(shí)例

                2.把該類的的singleton屬性設(shè)定為static再以Singleton;類的對(duì)象實(shí)例進(jìn)行初始化,這個(gè)初始化的過程僅加載Sington類的時(shí)候調(diào)用一次.(Line4) 

                3.把Singleton 類的構(gòu)造函數(shù)限定為private,目的是為了防止從非Singleton類(其他類)調(diào)用構(gòu)造函數(shù)來產(chǎn)生實(shí)例,如果通過new方式來產(chǎn)生Singleton實(shí)例,會(huì)出現(xiàn)編譯錯(cuò)誤.這樣做是為了保險(xiǎn)己見.(Line6) 

                4.要得到Singleton實(shí)例的唯一方法就是調(diào)用類靜態(tài)方法getInstance().這個(gè)名字可以隨便取,只要方便理解就行.(Line 10) 

     1 package singleton;
     2 
     3 public class Main {
     4 
     5     public static void main(String[] args) {
     6         System.out.println("Start");
     7         Singleton obj1 = Singleton.getInstance();
     8         Singleton obj2 = Singleton.getInstance();
     9         if(obj1 == obj2){
    10             System.out.println("obj1和obj2是同一個(gè)對(duì)象實(shí)例");
    11         }else{
    12             System.out.println("obj1和obj2不是同一個(gè)對(duì)象實(shí)例");
    13         }
    14         System.out.println("End");
    15     }
    16 }
    17 


           Main Class
            1.該類是測試程序.
            2.程序通過getInstance()方式產(chǎn)生兩個(gè)obj1和obj2實(shí)例.(Line 7,Line 8)
            3.通過ojb1= =ojb2表達(dá)式來確定兩個(gè)對(duì)象是否相同,判定是否產(chǎn)生了Singleton的第二個(gè)示例.(Line9-12)
     

    示例程序的執(zhí)行結(jié)果
    Start
    Create instance...
    obj1和obj2是同一個(gè)對(duì)象實(shí)例
    End

             執(zhí)行結(jié)果含義:
                    1. 的確如此,obj1和obj2是Singleton類的同一個(gè)且唯一的對(duì)象實(shí)例. 
                    2.當(dāng)程序執(zhí)行后,第一次調(diào)用getInstance的時(shí)候會(huì)初始化Singleton類,同時(shí)也會(huì)初始化static字段,也同時(shí)產(chǎn)生產(chǎn)生了一個(gè)唯一對(duì)象實(shí)例.




          [拓展思考]
       
    如下的另一一個(gè)單例模式的程序有什么隱患?

     1 package singleton;
     2 
     3 public class Singleton2 {
     4     
     5     private static Singleton2 singleton = null;
     6     
     7     private Singleton2(){
     8         System.out.println("已產(chǎn)生對(duì)象實(shí)例");
     9     }
    10     public static Singleton2 getInstance(){
    11         if(singleton == null){
    12             singleton = new Singleton2();
    13         }
    14         return singleton;
    15     }
    16 
    17 }
    18 

        [解答]
    當(dāng)多線程同時(shí)調(diào)用Singleton2.getInstance()方法時(shí),可能會(huì)產(chǎn)生多個(gè)對(duì)象實(shí)例,例如
    public class Main extends Thread{

        
    public static void main(String[] args) {
            System.out.println(
    "Starts.");
            
    new Main("A").start();
            
    new Main("B").start();
            
    new Main("C").start();
            System.out.println(
    "End.");
        }

       
        
    public void run(){
            Singleton2 obj 
    = Singleton2.getInstance();
            System.out.println(getName()
    +": obj ="+obj);
        }

        
        
    public Main(String name){
            
    super(name);
        }

    }




    public class Singleton2 {
        
    private static Singleton2 singleton2 = null;
        
    private Singleton2(){
            System.out.println(
    "已產(chǎn)生對(duì)象實(shí)例");
            solwDown();
        }


        
    public static Singleton2 getInstance(){
            
    if(singleton2 == null){
                singleton2 
    = new Singleton2();
            }

            
    return singleton2;
        }

        
         
    private  void solwDown(){
             
    try{
                 Thread.sleep(
    1000);
             }
    catch(InterruptedException e){
                 e.printStackTrace();
             }

         }

    }


    執(zhí)行結(jié)果:

    Start.
    End.
    已產(chǎn)生對(duì)象實(shí)例.
    已產(chǎn)生對(duì)象實(shí)例.
    已產(chǎn)生對(duì)象實(shí)例.
    B: obj = Singleton2#2a9348
    C: obj = Singleton2#b91134
    A: obj = Singleton2#e343l12

    (#替換為@)

    之所以會(huì)知道這種情況是因?yàn)閕f(singleton = = null){ singleton = new Singleton2(); }判斷不夠嚴(yán)謹(jǐn)?shù)膶?dǎo)致。
    利用: singleton == null 判斷為空后去執(zhí)行new Singleton2()之前,可能會(huì)有其他線程來搶先判斷表達(dá)式singleton == null,從而又執(zhí)行一遍創(chuàng)建實(shí)例的操作。

    解決辦法:
    給getInstance()方法添加Synchronized修飾符,即可修改成線程安全嚴(yán)謹(jǐn)?shù)膯卫J健?br />
    public class Singleton2 {
        
    private static Singleton2 singleton = null;

        
    private Singleton2() {
            System.out.println(
    "已產(chǎn)生對(duì)象實(shí)例");
            solwDown();
        }

        
    public static synchronized Singleton2 getInstance() {
            
    if (singleton == null) {
                singleton 
    = new Singleton2();
            }
            
    return singleton;
        }

        
    private void solwDown() {
            
    try {
                Thread.sleep(
    1000);
            } 
    catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    posted @ 2007-06-08 11:36 回歸 閱讀(1230) | 評(píng)論 (7)編輯 收藏

          [UML漫談]
          話說"工欲善其工需利其器",有了好的工具,好的表達(dá)方式,能給我們的工作變得簡單而優(yōu)雅.

          為了更好的講解設(shè)計(jì)模式,方便理解,需要運(yùn)用一種建模設(shè)計(jì)語言----UML.

           UML(UML:Unified Modeling Language),即統(tǒng)一建模語言,用來對(duì)軟件密集系統(tǒng)進(jìn)行描述、構(gòu)造、視化和文檔編制的一種語言.這是概念,不好理解.

           UML的作用,打個(gè)比方:一段描寫迷人海灘風(fēng)景的文字和一幅描繪海灘風(fēng)景的油畫,去看這兩件東西的人,有的人可能能讀懂文字(可能是特定的語言),有的不認(rèn)字,所以并不是所有的人能看懂文字表達(dá)的內(nèi)容,但是所有的人都能讀懂油畫所表現(xiàn)出來的含義.油畫表達(dá)內(nèi)容的直接,形象,豐富特性就類型UML在描敘軟件結(jié)構(gòu)過程中的作用.

           在軟件項(xiàng)目中,一般有幾個(gè)角色:用戶(User),架構(gòu)設(shè)計(jì)師(orPM, SA),程序員(PG)

             用戶:
                   也許不懂計(jì)算機(jī),也不懂編程語言,但是懂行業(yè)業(yè)務(wù),該軟件的功能需求.

           程序員
                  懂計(jì)算技術(shù),懂編程語言.但是不太了解行業(yè)邏輯.需要把客戶的業(yè)務(wù)應(yīng)用需求轉(zhuǎn)變?yōu)槌绦虼a,
             
           架構(gòu)設(shè)計(jì)師
                   資深的行業(yè)架構(gòu)設(shè)計(jì)師應(yīng)該具有一定的行業(yè)知識(shí),既能聽懂客戶的業(yè)務(wù)需求,又能知道怎么告訴程序員去用代碼實(shí)現(xiàn).

             架構(gòu)設(shè)計(jì)師在前兩者交流中起到承前啟后的"中間體"作用.UML就是采用圖形化的形式來表達(dá)架構(gòu)和設(shè)計(jì).成為了建模設(shè)計(jì)的通用的設(shè)計(jì)標(biāo)準(zhǔn)..


    UML圖讓信息交流變得簡單

          
         [UML基礎(chǔ)]
          

       此處只介紹幫助理解設(shè)計(jì)模式的UML基礎(chǔ),具體其他的UML圖示需要參考具體的講解UML的書籍.
        1.類的層級(jí)關(guān)系
              UML中的類圖是一種可表示一組類,對(duì)象實(shí)例和接口之間的靜態(tài)關(guān)系圖.




    如圖的UML類圖表達(dá)了上面代碼的含義,

    類之間的關(guān)系有四種:依賴,泛化,實(shí)現(xiàn)聚集,組成.具體的UML實(shí)例可以參UML基礎(chǔ).

    2.接口和實(shí)現(xiàn)

          實(shí)現(xiàn)接口的UML示例如下:


    interface Printable {
        
    abstract void print();
    }
    public class PrintClass implements Printable {

        
    public void print() {
            
    // how to print
        }

    }

    接口,抽象,實(shí)現(xiàn),繼承在設(shè)計(jì)模式中被廣泛的使用,這也是OOD的優(yōu)勢所在.美妙所在.

    這里只舉出了幾個(gè)簡單情形,讓大家有個(gè)感性的了解,具體的情形在說具體的設(shè)計(jì)模式的時(shí)候在針對(duì)性的說明,先不用弄那么多,那么雜,能開始下一步就足夠.

    類之間的關(guān)系

    類之間的關(guān)系有5種,關(guān)聯(lián) 依賴 聚集 泛化 實(shí)現(xiàn)
    posted @ 2007-06-08 09:53 回歸 閱讀(1073) | 評(píng)論 (0)編輯 收藏

    2007年6月5日 #

                                                                                     原創(chuàng)作者:阿風(fēng) 
                                                                                      日期:2007-06-05   

            首先說說寫這系列的文章的想法,目的在于:
            1.自己也在研習(xí)設(shè)計(jì)模式,通過在自我總結(jié)的過程中,希望能多設(shè)計(jì)模式多一點(diǎn)深刻理解
            2.希望給看到這系列文章的朋友一點(diǎn)對(duì)設(shè)計(jì)模式學(xué)習(xí)的幫助,特別是對(duì)設(shè)計(jì)模式的初學(xué)者能起到"引進(jìn)門"的效果,
            如果以上的作用能起到哪怕一點(diǎn),我也欣聞而笑了.

           設(shè)計(jì)模式(Design Patterns)是什么?為什么會(huì)出現(xiàn)設(shè)計(jì)模式?做過開發(fā)項(xiàng)目的朋友可能都遇到過,一個(gè)問題會(huì)在一個(gè)項(xiàng)目或者多個(gè)項(xiàng)目中重復(fù)出現(xiàn),而相應(yīng)的解決方案都是類似相同,相應(yīng)代碼的實(shí)現(xiàn)也是大同小異,為什么我們不能復(fù)用這些解決方案,或者說我們是否能修改或重新構(gòu)建一下設(shè)計(jì)架構(gòu)來使得重復(fù)的代碼更少,結(jié)構(gòu)更合理?  當(dāng)然,這些是可行且有必要的. 此時(shí)設(shè)計(jì)模式的出現(xiàn)讓我們茅舍頓開.

           說到設(shè)計(jì)模式,不得談一本書<Design Patterns:Element of Resuable Object-Oriented Software),作者是GoF,實(shí)際是三個(gè)人合著的.之所以提到這本書,因?yàn)檫@本書的經(jīng)典在于詳細(xì)闡述了23種在軟件開發(fā)過程中運(yùn)用廣泛的"模式",這一個(gè)理念的提出,給面向?qū)ο笤O(shè)計(jì)(OOD)注入了新的血液,體現(xiàn)出OOD超越面向過程設(shè)計(jì)的優(yōu)勢所在,從此讓程序員看待代碼有了"哲學(xué)的眼光"..

           就像這本書定義的模式:每個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)和發(fā)生的問題,以及該問題解決方案的核心,這樣你就能一次又一次使用該方案而不必做重復(fù)勞動(dòng).

            至此,設(shè)計(jì)模式的意義已經(jīng)凸現(xiàn),設(shè)計(jì)模式給我們的啟發(fā)又是什么?的確,每個(gè)經(jīng)典的設(shè)計(jì)模式體現(xiàn)出了大師的精湛思想,我們需要從中得到的啟發(fā)是能否"舉一反三",在我們每一次的軟件設(shè)計(jì)和開發(fā)中融入這些經(jīng)典模式,讓軟件設(shè)計(jì)得更易理解,更易拓展,更易維護(hù).這是設(shè)計(jì)模式給后人的最大啟示.
             
            經(jīng)典的設(shè)計(jì)模式給我的啟示應(yīng)該是個(gè)思想,而不是固定的那幾個(gè)模式,具體的軟件項(xiàng)目或軟件產(chǎn)品,會(huì)有不同情形,我們應(yīng)該依據(jù)具體的情況合理運(yùn)用模式思想,設(shè)計(jì)模式只是"招式"套路,要做到"無招勝有招",需要具體的情形分析,并非一定要套用所謂的模式,但是原則是不變的,"讓軟件易理解,易拓展,易維護(hù)".

             把語言特性和設(shè)計(jì)模式有機(jī)結(jié)合起來,對(duì)于程序員來說是一個(gè)成長的標(biāo)志點(diǎn)也是轉(zhuǎn)折點(diǎn),希望此文能對(duì)所有程序員有所幫助.
     

              用心去寫文章是件不容易的事情,需要堅(jiān)持和執(zhí)著,既然開始,就應(yīng)該堅(jiān)持到底..

            這個(gè)系列的文章主要是從GoF的歸納的23種設(shè)計(jì)中挑選十來個(gè)在軟件項(xiàng)目中常用和運(yùn)用的設(shè)計(jì)進(jìn)行講敘,講敘風(fēng)格應(yīng)該是簡單,深入淺出,思路和代碼相結(jié)合.

             該系列文章要講述的幾個(gè)經(jīng)典設(shè)計(jì)模式:(暫定)
                

    創(chuàng)建模式(Creational Patterns)
          * Singleton ------單例                                * Factory  Method -----工廠方法 



    結(jié)構(gòu)模式(Structural Patterns)
          * Adapter ------適配器                              * Facade -----外觀  

          * Decorator ------裝飾                               * Proxy -----代理

        

      
    行為模式(Behavioral Patterns)
          * Iterator------迭代器                              * Template Method-----模板方法  

          * Observer ------觀察者                          * Strategy -----策略



            實(shí)現(xiàn)語言采用Java,是設(shè)計(jì)模式讓OOD成為軟件開發(fā)歷史上的光輝更加絢爛.
        
           有人說:開始總是好的.所以,趕緊開始把.
            
    posted @ 2007-06-05 11:30 回歸 閱讀(1012) | 評(píng)論 (3)編輯 收藏

    主站蜘蛛池模板: 无码精品一区二区三区免费视频 | 亚洲乱码中文字幕久久孕妇黑人| 亚洲av无码电影网| 亚洲免费在线视频观看| 中文字幕在线免费看线人| 亚洲国产一区明星换脸| 日韩精品一区二区亚洲AV观看 | 亚洲AV无码成人精品区大在线| 亚洲精品9999久久久久无码| 日韩免费高清视频网站| 午夜影视日本亚洲欧洲精品一区| a级毛片高清免费视频就| 亚洲av午夜福利精品一区人妖| 97人妻精品全国免费视频| 无码乱人伦一区二区亚洲一| 鲁大师在线影院免费观看| 亚洲影视一区二区| 国产一级一毛免费黄片| 亚洲Av永久无码精品三区在线| 91精品国产免费| 中文字幕亚洲精品无码| 四虎永久在线精品免费观看地址| 亚洲精品美女视频| 99视频全部免费精品全部四虎| 亚洲AV成人影视在线观看| 免费a级毛片永久免费| 一区二区在线视频免费观看| 红杏亚洲影院一区二区三区| 免费在线看污视频| 大学生一级特黄的免费大片视频| 亚洲AV无码国产一区二区三区| 亚洲乱码国产一区网址| 182tv免费视频在线观看| 亚洲视频在线观看不卡| 午夜免费福利在线| 两个人看的www免费视频| 亚洲一区二区三区深夜天堂| 四虎成人精品在永久免费| 久久aa毛片免费播放嗯啊| 亚洲毛片基地4455ww| 中文字幕亚洲一区|