設計模式這個概念現在是滿天飛大家手裡面估計都有Erich Gamma Richard Helm Ralph Johnson and John Vlissides in the book Design Patterns Element of ReUseable ObjectOriented Software這本書根據其中的說法有三種創建型模式結構型模式和行為型模式一共包括個模式在這裡不一一列舉實際應用中我們不可能在短時間內消化吸收掉因為模式本身就是約定俗成的東西依靠大家以往的項目經驗總結出來的習慣用法習慣要時間去培養去形成所以大家不要急著去用所有的模式但一定要有這種意識在項目中學習中開始用上幾個看看研究研究模式給你會帶來什麼價值但如果你對Java JDK 源碼用到的設計模式感興趣可以到官方網站下載!
在進入正題之前我申明該文章沒有任何商業目的其中涉及到開源軟件的一些源代碼所以涉及到知識產權問題時如果有人將其用於商業目的個人不負責該方面的責任在這裡只用於學習交流的目的謝謝合作
但問題出來了如何將這些模式具體用到Java Project中呢?剛開始確實很頭疼一方面我們要知道模式的適用場合引入模式給系統帶來的好壞等等都需要我們去考慮的另一方面模式本身的理解消化吸收再者還有你的老板逼著你完成任務)等等其實冷靜分析一下也不是沒有可能我們在項目中完成自己的工作是一方面但另一方面要考慮好自己的職業生涯要想把Java CoderJava DeveloperJava Architect或者什麼的……做好這些都是基本功
學者就是喜歡把+這麼簡單的問題用什麼理論推導出來作為技術工作者比如我們看的是結果技術的實作性而大家在學設計模式中的過程中往往脫離實踐看看設計模式的UML圖(說句實在話大家的UML功底都不會太好吧把它用於我們的UP估計也少)還有模式的什麼意圖別名動機適用性結構參與者協作效果實現代碼實例腦袋都暈掉了大家是否給忘記了這種GP本來
就很抽象加上這麼多條條框框兩個字郁悶我們不妨從分析GP代碼入手效果很很不錯我學習過程中就是這樣的要不我們現在就看看一個例子以行為型模式State為例(模式的實現例子網絡上有很多Java的實現也很多比如Together ControlCenter裡面就內置了這種基於GP的編程模板詳細內容大家用用就知道了)
大家知道State的用意在於允許一個對象在其內部狀態改變時改變它的行為對象看起來似乎修改了他的類我們先看 上提供的GOF SOFTWARE DESIGN PATTERNS CATALOGUE的State模式源碼實現
首先看接口類Statejava
public interface State {
public void handle();
}
以定義接口以封裝與Conext(代碼稍候陳述!)的一個特定狀態相關的行為
然後看接口的實現類第一個ConcreteStatejava
public class ConcreteState
implements State {
public void handle() {
System
out
println(
ConcreteState
handle() executing
);
}
}
第二個ConcreteStatejava
public class ConcreteState
implements State {
public void handle() {
System
out
println(
ConcreteState
handle() executing
);
}
}
這兩個類實現了State接口
然後再看Contextjava是如何將上述三個java文件聯系起來
public class Context {
public static final int STATE_ONE =
;
public static final int STATE_TWO =
;
//大家注意這句話很關鍵該模式做手腳的地方!
private State currentState = new ConcreteState
();
public void request() {
currentState
handle();
}
public void changeState(int state) {
switch (state) {
case STATE_ONE:
currentState = new ConcreteState
();//關鍵點
break;
case STATE_TWO:
currentState = new ConcreteState
();//關鍵點
break;
}
}
}
這樣寫好個java文件後其實您已經實現了State設計模式很有趣對吧?就是這樣簡單
再看看如何使用該設計模式了寫一個Clientjava看看
public class Client {
public static void main(String[] args) {
// 構造Context
Context ctx = new Context();
// 喚起Context
request()
ctx
request();
// 改變ctx的狀態?為什麼改變了呢?大家想想看
ctx
changeState(Context
STATE_TWO);
// 再次喚起Context
request()
結果大不一樣
ctx
request();
}
}
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27429.html