設計模式學習筆記 之四 如何處理變化的需求

2021-04-13 07:44:49 字數 2167 閱讀 2692

如果我們能夠以不變應萬變,那麼我們是相當的成功了,這是個無法完成的任務。

但如果我們能以最小的代價來應對這變化無窮的需求,那麼我們就沒有失敗... ...

為了解決變化的需求帶給我們的困惑,也為了**到底有沒有「功能分解」這外的其他選擇,我們還是回到現實生活中看看人們是如何做事的,細心的觀察,耐心的體會,會發現一些我們平時沒有注意的東西。

假設這樣一種情況,您是一名大學講師,今天聽您課程的人都是剛入學第一天的新生,他們在你的課程之後還有其他的課程,但卻又不知道下一節課的上課地點。你的職責之一,就是確保每個人都知道到**去上下一節課。

面對這樣的問題我們該怎麼處理呢?如果遵循結構化程式設計的方法,可能會這樣做:

1、獲得上課人員的名單。

2、對於名單上的每個人:

a.查詢他的下一節課程。

b.查詢下一節課的上課地點。

c.查詢到下一節課的教室的路徑。

d.告訴學生怎樣去上下一節課。

為了實現上面的過程,我們可能需要:

1、獲得課堂上人員名單的方法。

2、獲得每個人課程表的方法。

3、乙個程式來告訴某個學生如何從現在的教室到另外任何乙個教室。

4、乙個控制程式來為每個人做需要的步驟。

現實生活中我們真的會這樣做嗎?如果你是一對一的教學這樣當然沒有問題,但是如果你面對的是幾十上百的學生,等到告訴完每乙個學生,可能天都要黑了!實際上,你完全可以把從你的教室到其他教室的路徑張貼出來,然後告訴上課的所有學生:「我把其他的課程和相應教室的位址張貼在教室後面了。請按照這份位址表去你們的下乙個教室。」我們期望每個人都知道他們的下一節課是什麼。這樣他們可以在表上查詢到他們要去的教室,並根據表上給出的位址自己走到應該去的教室去。

兩種方法的不同之處在於?

* 用第一種方法----對每個人都明確地指出路徑----你必須密切注意許多細節。除了你之外的任何人對任何事都沒有任何責任。就算你是「孺子牛」,也會瘋掉的!

* 用第二種方法,你給出乙個普通的指令,並期望每個人都能自己知道如何完成你給出的任務。

最大的區別就是責任的轉移。在第一種方案中,你對所有的事表負責;而在第二種方案中,學生對他們自己的行為負責。兩種方案用於實現同樣的東西,但組織方式有著巨大的差異。

為了看到責任重新組織的效果,讓我們看看當新的需求出現時會發生什麼。

假設我被告知:需要給新生中的班幹部特殊的指令。也許他們需要在下課後先到指定地點去領取新書,然後再去上下一節課。在第一種方案中,我們必須修改控制程式來區分班級幹部和普通學生,然後再給班級幹部下特殊的指令。這樣很可能我要對程式做相當多的修改。但是,在第二種方案中,每個學生對自己的行為負責,我只需要為班級幹部編寫乙個附加的程式。控制程式仍然只是說:去你的下乙個教室。」第個人都只是相應地按照這條指令去做。

這是控制程式的巨大區別。在第一種方案中,每當出現一種需要按特殊指令行事的新學生時,控制程式都必須被修改。在第二種方案中,新型別的學生必須對自己的行為負責。

三處改變造就了這樣的結果。它們是:

* 每個人對自己負責,而不再由控制程式對他們負責。(為實現這一點,第個「人」都必須知道自己是什麼型別的「學生」。)

* 控制程式可以與不同型別的人(班幹部和普通學生)交流,就好像他們是同一型別的一樣。

* 控制程式不需要知道學生在教室之間移動的任何特殊步驟。

為了更好的詮釋上面案例中的內容,我們有必要引入一些術語,從更高的層次再次審視我們的案例。

軟體開發過程中的視角(uml)視角描述

概念(conceptual)

展現了問題領域中的概念,乙個概念模型可以在對實現軟體有很少或毫無注意的情況下畫出

規格(specification)

現在的軟體,注重的是軟體的介面,而不是軟體的實現

實現(implementation)

置身於**本身。「這可能是最常用的視角,但更多的時候,規格視角是更好的視角。」

案例中的講師,是在概念層次上與學生進行交流。換句話說,你告訴學生「你希望他做什麼」,而不是「怎麼樣去做」。但是,他們走到下乙個教室的路徑各不相同。他們按照各自不同的指定行事,這就是實現層次上的工作了。

在乙個層次上(概念層次)上通訊而在另乙個層次(實現層次)上執行,其結果就是請求者(講師)不知道具體發生了什麼,只知道「概念上」發生了什麼。這一點非常重要。這就是責任轉移所帶來的好處。

待續:下一節,我們將會通過案例,講述如何將這些概念應用到程式設計當中去。

設計模式學習筆記之四 外觀模式

外觀模式 facade 為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。以上的定義摘自 大話設計模式 按我自己的理解,外觀模式 將乙個或多個類中的多個方法打包到乙個方法中供外界呼叫。打個比方,現有a類的a方法 b類的b方法 c類的c方法,我們的業...

學習筆記之設計模式

設計模式 模式是一種解決問題的思路,它已經適應了一種實踐環境,並且可以使用其他環境 用牛耕地,打井取水 特點在特定場景下有重用性,對相同型別不同問題的環境,其解決方案都有效可傳授性,就是問題出現的機會很多解決問題的方案相同,人們相對可以接受有表示模式的名稱優點 重用設計 系統容易重構 節省時間 五個...

設計模式筆記之四 原型模式

原型模式 原型模式就是需要建立多個例項的時候,以乙個為原型,其他例項複製 轉殖這個原型來獲得相似的例項。我們的實驗室最近研究這個模式還是因為市場的原因,市場上由於長久以來的習俗和政策,對女人的需求比較大,所有我們就的擴大女人的生產線,但是由於資金的原因,我們不能投入硬體成本只能改進我們的方法。首先我...