摘要: 設(shè)計(jì)模式之Proxy模式  閱讀全文

          posted @ 2007-12-06 13:19 flustar 閱讀(3532) | 評(píng)論 (0)編輯 收藏

               摘要: 設(shè)計(jì)模式之state模式  閱讀全文

          posted @ 2007-12-05 16:35 flustar 閱讀(1603) | 評(píng)論 (1)編輯 收藏

               摘要: 設(shè)計(jì)模式之Command模式  閱讀全文

          posted @ 2007-12-05 13:23 flustar 閱讀(1407) | 評(píng)論 (0)編輯 收藏

               摘要: 設(shè)計(jì)模式之Iterator模式  閱讀全文

          posted @ 2007-12-04 23:52 flustar 閱讀(3231) | 評(píng)論 (1)編輯 收藏

               摘要: 設(shè)計(jì)模式之Builder模式  閱讀全文

          posted @ 2007-12-03 21:39 flustar 閱讀(1231) | 評(píng)論 (0)編輯 收藏

               摘要: 設(shè)計(jì)模式之Prototype模式  閱讀全文

          posted @ 2007-12-02 16:16 flustar 閱讀(1002) | 評(píng)論 (0)編輯 收藏

               摘要: 設(shè)計(jì)模式之Factory Method模式  閱讀全文

          posted @ 2007-11-29 17:41 flustar 閱讀(1712) | 評(píng)論 (0)編輯 收藏

           《設(shè)計(jì)模式》一書對(duì)Singleton模式是這樣描述的:
          保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
          這個(gè)模式比較簡單,下面給出一個(gè)例子:
          public class Singleton {
            private static Singleton instance;
            private Singleton(){
            
            }
            public static Singleton getInstance(){
             if(instance==null)
              instance=new Singleton();
             return instance;
            }
          }
          這個(gè)程序在單線程下運(yùn)行不會(huì)有問題,但是它不能運(yùn)行在多線程的環(huán)境下,若想讓運(yùn)行在多線程的環(huán)境下,必須修改如下:
          public class Singleton {
            private static class Instance{
             static final Singleton instance=new Singleton();
            }
            private Singleton(){
            
            }
            public static Singleton getInstance(){
             return Instance.instance;
            }
          }
          這樣做之所以可以,是因?yàn)殪o態(tài)的內(nèi)部類Instance只會(huì)被裝載一次。運(yùn)行在多線程下的單態(tài)設(shè)計(jì)模式也叫Double-Checked Looking模式。

          posted @ 2007-11-28 20:39 flustar 閱讀(710) | 評(píng)論 (1)編輯 收藏

           《設(shè)計(jì)模式》一書對(duì)Template Method模式是這樣描述的:
           定義一個(gè)操作中算法的骨架,而將一些步驟延遲到子類中。不改變算法的結(jié)構(gòu)而重新定義它的步驟。
           我的理解:定義一個(gè)抽象類或者說接口,在它的內(nèi)部定義一些抽象的方法(供TemplateMethod調(diào)用的步驟)和一個(gè)TemplateMethod方法(非抽象方法),封裝了這些抽象方法的接口或抽象類就是骨架。而將它的實(shí)現(xiàn)延遲到子類中,也就是用子類實(shí)現(xiàn)它。不改變算法的結(jié)構(gòu)而重新定義它的步驟,也就是改寫或者實(shí)現(xiàn)父類的這些非TemplateMethod的抽象方法。下面給出一個(gè)例子:
          abstract class QueryTemplate{
           public void doQuery(){  //Template Method
            formatConnect();
            formatSelect();
           }
            protected abstract void formatConnect();
            protected abstract void formatSelect();
          }
          class OracleQT extends QueryTemplate{
           public void formatConnect() {
            System.out.println("格式化Qracle數(shù)據(jù)庫連接");
           }
           public void formatSelect() {
            System.out.println("格式化Oracle數(shù)據(jù)庫查詢");
           }
          }
          class MysqlQT extends QueryTemplate{
           public void formatConnect() {
            System.out.println("格式化Mysql數(shù)據(jù)庫連接");
           }
           public void formatSelect() {
            System.out.println("格式化Mysql數(shù)據(jù)庫查詢");
           }
          }
          public class client {
           public static void main(String[] args) {
            QueryTemplate oracleQT=new OracleQT();
            oracleQT.doQuery();
            
            QueryTemplate mysqlQT=new MysqlQT();
            mysqlQT.doQuery();
           }
          }
          輸出結(jié)果:
          格式化Qracle數(shù)據(jù)庫連接
          格式化Oracle數(shù)據(jù)庫查詢
          格式化Mysql數(shù)據(jù)庫連接
          格式化Mysql數(shù)據(jù)庫查詢
          在這個(gè)例子中,我們定義了一個(gè)骨架QueryTemplate,在它的內(nèi)部定義了一個(gè)Template Method,和一些步驟(抽象方法),使用Template Method來調(diào)用這些步驟。步驟是在子類中實(shí)現(xiàn)的。
          小結(jié):有時(shí)候,會(huì)遇到由一系列步驟構(gòu)成的過程需要執(zhí)行。這個(gè)過程從高層次上看是相同的,但有些步驟的實(shí)現(xiàn)可能不同。正如,查詢SQL數(shù)據(jù)庫從高層次上看過程是相同的,但某些細(xì)節(jié)比如如何連接數(shù)據(jù)庫則可能因平臺(tái)等細(xì)節(jié)的不同而不同。通過Template Method模式,我們可以先定義步驟序列,然后覆蓋那些需要改變的步驟。

           

          posted @ 2007-11-28 20:36 flustar 閱讀(989) | 評(píng)論 (0)編輯 收藏

           《設(shè)計(jì)模式》一書對(duì)Observer是這樣描述的:
          定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知并自動(dòng)更新。
          舉個(gè)例子,在現(xiàn)實(shí)生活中,父母與孩子是最親密的人。父母做為孩子(被觀察者)的監(jiān)護(hù)人(觀察者),當(dāng)孩子和別人打架后,一定會(huì)告訴他的父母這件事(呵呵,當(dāng)孩子很小時(shí),通常會(huì)告訴父母,長大了以后,可能不會(huì),這里的孩子指的是小孩子),當(dāng)孩子獲得獎(jiǎng)學(xué)金后,也一定會(huì)告訴他的父母。下面我用Observer實(shí)現(xiàn)這個(gè)程序。代碼如下:
          import java.util.Vector;

          class Children{
           static private Vector<Observer> obs;
           static private String state=null;
           static{
            obs=new Vector<Observer>();
           }
           public static void attach(Observer o){
            obs.addElement(o);
           }
           public static void detach(Observer o){
            obs.removeElement(o);
           }
           public void setState(String str){
            state=str;
           }
           public String getState(){
            return state;
           }
           public void notifyObs(){
            for(Observer o:obs){
             o.update(this); 
            }
           }
          }
          interface Observer{
           public void update(Children child);
          }
          class Parent implements Observer{
           public void update(Children child){
            if(child.getState().equals("fight")){
             System.out.println("Parent,他和別人打架了");
            }else if(child.getState().equals("scholarship")){
             System.out.println("告訴Parent,他得到了獎(jiǎng)學(xué)金");
            }
           }
          }
          class Mother implements Observer{
           public void update(Children child){
            if(child.getState().equals("fight")){
             System.out.println("告訴Mother,他和別人打架了");
            }else if(child.getState().equals("scholarship")){
             System.out.println("告訴Mother,他得到了獎(jiǎng)學(xué)金");
            }
           }
          }
          public class Client {

           public static void main(String[] args) {
            Children child=new Children();
            Observer parent=new Parent();
            Observer mother=new Mother();
            child.attach(parent);
            child.attach(mother);
            child.setState("fight");
            child.notifyObs();
            child.setState("scholarship");
            child.notifyObs();

           }

          }

          輸出如下:
          告訴Parent,他和別人打架了
          告訴Mother,他和別人打架了
          告訴Parent,他得到了獎(jiǎng)學(xué)金
          告訴Mother,他得到了獎(jiǎng)學(xué)金
           小結(jié):對(duì)于Observer模式,觸發(fā)事件的對(duì)象-Subject對(duì)象無法預(yù)測可能需要知道該事件的所有對(duì)象。為了解決這一問題,我們創(chuàng)建一個(gè)Observer接口,要求所有的Observer負(fù)責(zé)將自己注冊(cè)到Subject上。

          posted @ 2007-11-28 20:34 flustar 閱讀(652) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 浮梁县| 新野县| 云龙县| 邹城市| 常州市| 淮北市| 晴隆县| 寿光市| 台山市| 邢台市| 枝江市| 金平| 义马市| 石泉县| 辰溪县| 白朗县| 苗栗市| 汉沽区| 娱乐| 新宁县| 武城县| 武穴市| 新干县| 奈曼旗| 清河县| 保靖县| 天镇县| 霍城县| 武冈市| 南木林县| 冷水江市| 千阳县| 利津县| 延安市| 益阳市| 甘泉县| 舟曲县| 北宁市| 湖口县| 六盘水市| 黔东|