明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

J2EE相關(guān)設(shè)計(jì)模式討論

[摘要]設(shè)計(jì)模式,這個概念現(xiàn)在是滿天飛,大家手里面估計(jì)都有,三種,創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。一共包括23個模式,在這里不一一列舉。實(shí)際應(yīng)用中,我們不可能在短時間內(nèi)消化吸收掉,因?yàn)槟J奖旧砭褪羌s定俗成的東西,依靠大家以往的項(xiàng)目經(jīng)驗(yàn)總結(jié)出來的習(xí)慣用法。習(xí)慣要時間去培養(yǎng),去形成,所以大家不要急著去用所...
設(shè)計(jì)模式,這個概念現(xiàn)在是滿天飛,大家手里面估計(jì)都有,三種,創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。一共包括23個模式,在這里不一一列舉。實(shí)際應(yīng)用中,我們不可能在短時間內(nèi)消化吸收掉,因?yàn)槟J奖旧砭褪羌s定俗成的東西,依靠大家以往的項(xiàng)目經(jīng)驗(yàn)總結(jié)出來的習(xí)慣用法。習(xí)慣要時間去培養(yǎng),去形成,所以大家不要急著去用所有的模式,但一定要有這種意識,在項(xiàng)目中、學(xué)習(xí)中開始用上幾個看看,研究研究模式給你會帶來什么價值。但如果,你對Java JDK1.4 源碼用到的設(shè)計(jì)模式感興趣,可以到官方網(wǎng)站下載!這個地方有詳細(xì)說明,http://www.javaresearch.org/dn.jsp。

   在進(jìn)入正題之前,我申明該文章沒有任何商業(yè)目的,其中涉及到開源軟件的一些源代碼,所以涉及到知識產(chǎn)權(quán)問題時,如果有人將其用于商業(yè)目的,個人不負(fù)責(zé)該方面的責(zé)任。在這里只用于學(xué)習(xí)、交流的目的。謝謝合作。

   好,接下來繼續(xù)往下看。

   但問題出來了,如何將這些模式具體用到Java Project中呢?剛開始確實(shí)很頭疼。一方面,我們要知道模式的適用場合、引入模式給系統(tǒng)帶來的好壞,等等都需要我們?nèi)タ紤]的。另一方面,模式本身的理解消化吸收。再者,還有你的老板逼著你完成任務(wù)-:)。等等。其實(shí),冷靜分析一下,也不是沒有可能。我們在項(xiàng)目中,完成自己的工作是一方面,但另一方面要考慮好自己的職業(yè)生涯,要想把Java Coder、Java Developer、Java Architect、或者什么的……做好,這些都是基本功。

   學(xué)者,就是喜歡把1+1,這么簡單的問題用什么。。。。理論推導(dǎo)出來,作為技術(shù)工作者,比如我們,看的是結(jié)果,技術(shù)的實(shí)作性。而大家在學(xué)設(shè)計(jì)模式中的過程中,往往脫離實(shí)踐,看看設(shè)計(jì)模式的UML圖(說句實(shí)在話,大家的UML功底都不會太好吧,把它用于我們的UP估計(jì)也少。)、還有模式的什么意圖,別名,動機(jī),適用性,結(jié)構(gòu),參與者,協(xié)作,效果,實(shí)現(xiàn),代碼實(shí)例,。。。。。。。腦袋都暈掉了。大家是否給忘記了,這種GP,本來就很抽象,加上這么多條條框框,兩個字,“郁悶”。我們不妨從分析GP代碼入手效果很很不錯,我學(xué)習(xí)過程中就是這樣的。要不我們現(xiàn)在就看看一個例子。以行為型模式State為例。(模式的實(shí)現(xiàn)例子網(wǎng)絡(luò)上有很多。Java的實(shí)現(xiàn)也很多,比如,Together ControlCenter里面就內(nèi)置了這種基于GP的編程模板,詳細(xì)內(nèi)容大家用用就知道了。)

   大家知道,State的用意在于,允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了他的類。我們先看http://www.javacoder.net/patterns.jsp 上提供的GOF SOFTWARE DESIGN PATTERNS CATALOGUE的State模式源碼實(shí)現(xiàn)。
   首先看接口類,State.java

   public interface State {

   public void handle();

  }

  以定義接口以封裝與Conext(代碼稍候陳述!)的一個特定狀態(tài)相關(guān)的行為。

  然后看,接口的實(shí)現(xiàn)類。第一個,ConcreteState1.java

  public class ConcreteState1 implements State {

   public void handle() {
   System.out.println("ConcreteState1.handle() executing");
   }

  }

  第二個,ConcreteState2.java

  public class ConcreteState2 implements State {
   public void handle() {
   System.out.println("ConcreteState2.handle() executing");
   }
  }

  這兩個類實(shí)現(xiàn)了State接口。

  然后再看,Context.java是如何將上述三個.java文件聯(lián)系起來。

  public class Context {
   public static final int STATE_ONE = 0;
   public static final int STATE_TWO = 1;
   //大家注意,這句話很關(guān)鍵,該模式做手腳的地方!
   private State currentState = new ConcreteState1();

   public void request() {
   currentState.handle();
   }

   public void changeState(int state) {
   switch (state) {
   case STATE_ONE:
   currentState = new ConcreteState1();//關(guān)鍵點(diǎn)
   break;
   case STATE_TWO:
   currentState = new ConcreteState2();//關(guān)鍵點(diǎn)
   break;
   }
   }
  }

  這樣,寫好4個.java文件后,其實(shí)您已經(jīng)實(shí)現(xiàn)了State設(shè)計(jì)模式,很有趣,對吧?就是這樣簡單。
  再看看如何使用該設(shè)計(jì)模式了。寫一個Client.java看看。

  public class Client {

   public static void main(String[] args) {
   // 構(gòu)造Context
   Context ctx = new Context();
   // 喚起Context.request()
   ctx.request();
   // 改變ctx的狀態(tài)?為什么改變了呢?大家想想看。
   ctx.changeState(Context.STATE_TWO);
   // 再次喚起Context.request(),結(jié)果大不一樣。
   ctx.request();
   }
  }

  是不是您也想試試呢?要不自己動手運(yùn)行一下看看就知道了。