探索軟體設計模式

來源:互聯網
上載者:User

     軟體設計模式來源於Christopher Alexander的建築學模式和對象運動。根據Alexander的觀點,模式就是一個對於特定的系統的通用解決方案本身的重複。對象運動關注於將現實世界模化為軟體內部的關係。基於這兩個原因,軟體設計模式對於真實世界的物體而言同樣應當是可以重複的。這篇文章呈現了現實的世界中的非軟體的模式執行個體,這些模式來源於《設計模式-可複用物件導向軟體的基礎》(Design Patterns - Elements of Reusable Object-Oriented Software)[13]一書。這篇文章也舉例討論了模式語言對非軟體的表現力和設計模式的練習。

在軟體行業中,模式支援者的團體正在擴大。模式發展的起源可以在建築師Christopher Alexander的著作中找到,他認為模式是世界上特定系統的通用解決方案。他描述的模式可以在日常的建築物中觀察到。《模式語言》(A Pattern Language)中的每個模式都包含了一張該模式原始範例的圖片。

雖然物質是主流世界的觀點,而模式為軟體世界所信奉,模式也有其體現事物發展的根源。不幸的是軟體設計模式的例子不象Alexander模式那麼豐富,因為軟體設計表現的是精緻的構思而不是那些最初產生的想法。當今大多數軟體的專有性限制了我們接觸一流設計的機會。

根據Alexander的說法,現實世界中模式總是重複自己,因為在一個特定的環境下,它們總是很好地適應現有的環境因素。在軟體中,要麼現實世界的問題被完全地模式化,要麼現實世界的物體被轉換成為硬體和軟體,用來產生現實世界的結果。既然軟體設計模式根源於Alexander的樣式和對象,那麼在現實世界中找到軟體設計模式也是很正常的。這並不是說軟體設計模式是現實世界事物的必然模型,而是說在契合的對象之間相互影響的關係可以在"現實世界"和軟體對象中同樣地觀察到。為了驗證這個假設,我們將為每一種設計模式找出一個現實世界的例子來。

建立型模式

作者(指《設計模式》的作者-譯註,下同)總結了五種建立型模式。建立型模式的例子可以在製造業,快餐,生物和行政機構中找到。

抽象工廠(Abstract Factory)舉例

抽象工廠的目的是要提供一個建立一系列相關或相互依賴對象的介面,而不需要指定它們具體的類。這種模式可以在日本汽車製造廠所使用的金屬衝壓裝置中找到。這種衝壓裝置可以製造汽車車身組件。同樣的機械用於衝壓不同的車型的右邊車門、左邊車門、右前擋泥板、左前擋泥板和引擎罩等等。通過使用轉輪來改變衝壓盤,這個機械產生的具體類可以在三分鐘內改變。

圖1:抽象工廠的衝壓例子

產生器(Builder)舉例

產生器模式將複雜物件的構建與對象的表現分離開來,這樣使得同樣的構建過程可以建立出不同的表現。這種模式用於快餐店製作兒童餐。典型的兒童餐包括一個主食,一個輔食,一杯飲料和一個玩具(例如漢堡、炸雞、可樂和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過程是相同的。無論顧客點的是漢堡,三名治還是雞肉,過程都是一樣的。櫃檯的員工直接把主食,輔食和玩具放在一起。這些是放在一個袋子中的。飲料被倒入杯中,放在袋子外邊。這些過程在相互競爭的餐館中是同樣的。

圖2:使用兒童餐作為例子的產生器模式的對象作用表

Factory 方法(Factory Method)

Factory 方法定義一個用於建立對象的介面,但是讓子類決定執行個體化哪個類。壓注成型示範了這種模式。塑料玩具製造商加工塑料粉,將塑料注入到希望形狀的模具中。玩具的類別(車,人物等等)是由模具決定的。



圖3:使用注入成型為例子的Factory 方法的對象圖

原型(Prototype)舉例

原型模式使用原型執行個體指定建立對象的種類。新產品的原型通常是先於全部產品建立的,這樣的原型是被動的,並不參與複製它自己。一個細胞的有絲分裂,產生兩個同樣的細胞,是一個扮演主動角色複製自己原型的例子,這示範了原型模式。一個細胞分裂,產生兩個同樣基因型的細胞。換句話說,細胞複製了自己。



圖4:使用細胞分裂例子的原型模式對象圖

單件(Singleton)舉例

單件模式確保一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。單件模式是模仿單集命名的,單集的定義是每個集合僅含有一個元素。美國總統的職位是單件,美國憲法規定了總統的選舉,任期以及繼任的順序。這樣,在任何時刻只能由一個現任的總統。無論現任總統的身份為何,其頭銜"美利堅美利堅合眾國總統"是訪問這個職位的人的一個全域的訪問點。



圖5:使用總統例子的單件模式對象圖


結構性模式

作者總結了七個結構型模式,這些模式的例子可以在工具、住宅配線、數學、節日傳統、零售目錄和銀行業中找到。

適配器(Adapter)舉例

適配器模式允許將一個類的介面轉換成客戶期望的另一個介面,使得原本由於介面不相容而不能一起工作的類可以一起工作。扳手提供了一個適配器的例子。一個孔套在棘齒上,棘齒的每個邊的尺寸是相同的。在美國典型的邊長為1/2''和1/4''。顯然,如果不使用一個適配器的話,1/2''的棘齒不能適合1/4''的孔。一個1/2''至1/4''的適配器具有一個1/2''的陰槽來套上一個1/2''的齒,同時有一個1/4的陽槽來卡入1/4''的扳手。



圖6:使用扳手適配器例子的配接器物件圖

橋接(Bridge)舉例

橋接模式將抽象部分與它的實現分離,使它們能夠獨立地變化。一個普通的開關控制的電燈、電風扇等等,都是橋接的例子。開關的目的是將裝置開啟或關閉。實際的開關可以是簡單的雙刀拉鏈開關,也可以是調光開關。


圖7:使用電子開關例子的橋接對象圖

組合(Composite)例子

組合模式將對象組合成樹形結構以表示"部分-整體"的階層。讓使用者一致地使用單個對象和組合對象。雖然例子抽象一些,但是算術運算式確實是組合的例子。算術運算式包括運算元、操作符和另一個運算元。運算元可以是數字,也可以是另一個運算式。這樣,2+3和(2+3)+(4*6)都是合法的運算式。



圖8:使用算術運算式例子的組合模式對象圖

裝飾(Decorator)舉例

裝飾模式動態地給一個對象添加額外的職責。不論一幅畫有沒有畫框都可以掛在牆上,但是通常都是有畫框的,並且實際上是畫框被掛在牆上。在掛在牆上之前,畫可以被蒙上玻璃,裝到框子裡;這時畫、玻璃和畫框形成了一個物體。



圖9:使用有畫框的畫作為例子的裝飾模式對象圖

外觀(Facade)舉例

面板模式為子系統中的介面定義了一個統一的更高層次的介面,以便於使用。當消費者按照目錄採購時,則體現了一個面板模式。消費者撥打一個號碼與客服代表聯絡,客服代表則扮演了這個"外觀",他包含了與訂貨部、收銀部和送貨部的介面。




圖10:使用電話訂貨例子的面板模式對象圖

享元(Flyweight)舉例

享元模式使用共用技術有效地支援大量細粒度的對象。公用交換電話網(PSTN)是享元的一個例子。有一些資源例如撥號音發生器、響鈴發生器和撥號接收器是必須由所有使用者共用的。當一個使用者拿起耳機打電話時,他不需要知道使用了多少資源。對於使用者而言所有的事情就是有撥號音,撥打號碼,撥通電話。


圖11:使用撥號音發生器例子的享元模式對象圖


代理(Proxy)模式

代理模式提供一個中介以控制對這個對象的訪問。一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,並提供對簽發人帳號上資金的控制。



圖12:使用銀行存單例子的代理模式對象圖 

行為模式

作者總結了十一種行為模式。這些模式可以在硬幣分類銀行、餐館訂餐、音樂、運輸、汽車修理、自動售貨機和家庭建築中找到例子。

職責鏈(Chain of Responsibility)舉例

職責鏈模式使得多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。機械硬幣分揀銀行使用職責鏈。這裡並不是為每一種硬幣分配一個滑槽,而是僅使用一個滑槽。當硬幣落下時,硬幣被銀行內部的機械導向至適當的接收盒。



圖13:使用硬幣分揀例子的職責鏈模式對象圖

命令(Command)模式

命令模式將一個請求封裝為一個對象,從而使你可以使用不同的請求對客戶進行參數化。用餐時的賬單是命令模式的一個例子。服務員接受顧客的點單,把它記在賬單上封裝。這個點單被排隊等待烹飪。注意這裡的"賬單"是不依賴於菜單的,它可以被不同的顧客使用,因此它可以添入不同的點單項目。

解譯器(Interpreter)舉例

解譯器模式定義了特定語言的文法表示和解釋該文法的解譯器。音樂家是解譯器的例子。音階和它的期間可以用五線譜上的符號表示。這些符號就是音樂語言[14]。音樂家按照樂譜演奏,就可以反覆重現同樣的音樂。

迭代器(Iterator)舉例

迭代器提供一種方法順序訪問一個集合對象中各個元素,而又不需要暴露該對象的內部表示。在早期的電視機中,一個撥盤用來改變頻道。當改變頻道時,需要手工轉動撥盤移過每一個頻道,而不論這個頻道是否有訊號。現在的電視機,使用[後一個]和[前一個]按鈕。當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。

中介者(Mediator)舉例

中介者模式用一個中介對象來控制一系列的對象互動。通過中介者實現各個對象之間的鬆散耦合,而不是彼此直接作用。機場的控制塔很好地示範了這種模式。降落或者起飛的飛機直接與塔台通訊,而不是彼此間直接通訊。誰可以起飛或降落是由塔台決定的。這裡需要注意的是塔台並不控制整個飛行過程。它只負責飛機在機場附近的地區。



圖17:使用訓練中心為例子的中介者模式

備忘錄(Memento)舉例

備忘錄模式捕獲並且在外部儲存一個對象的內部狀態,使得以後可以將對象恢複到該狀態。這種模式通常體現在你自己修理汽車的刹車時。首先移開兩邊的擋板,露出左右刹車片。只能卸下一片,這時另一片作為一個備忘錄來表明刹車是怎樣安裝的。在這片修理完成後,才可以卸下另一片。當第二片卸下時,第一片就成了備忘錄。



觀察者(Observer)模式

觀察者定義了對象間一對多的關係,當一個對象的狀態變化時,所有依賴它的對象都得到通知並且自動地更新。拍賣示範了這種模式。每個投標人都有一個標有數位牌子用於出價。拍賣師開始拍賣時,他觀察是否有牌子舉起出價。每次接受一個新的出價都改變了拍賣的當前價格,並且廣播給所有的投標人進行新的出價。



狀態(State)模式

狀態模式允許一個對象在其內部狀態改變時改變它的行為。這種模式可以在自動售貨機上觀察到。自動售貨機的狀態包括列商品清單,收款,找錢和選擇商品等幾種狀態。當投入硬幣並選擇了一個商品時,自動售貨機可以完成以下幾種操作,包括:送出商品不找錢、送出商品並找錢、由於投幣不足不送出商品、由於商品售完不送出商品。



策略(Strategy)模式

策略模式定義了一系列可以相互替換的演算法。不同的到飛機場去的方式就是一個策略模式的例子。有幾種選擇:自己開車、坐出租車、乘機場班車、乘公用汽車或使用專車服務等等。對於某些機場,地鐵和直升機也是可能的選擇。任何一種方式都可以把你送到機場,它們可以相互代替。你必鬚根據價格、便利性和時間做出選擇。

模板方法(Template Method)舉例

模板方法定義了一個操作中演算法的骨架,房屋建築師在開發新項目時會使用模板方法。一個典型的規劃包括一些建築平面圖,每個平面圖體現了不同部分。在一個平面圖中,地基、結構、上下水和走線對於每個房間都是一樣的。只有在建築的後期才開始有差別而產生了不同的房屋樣式。

訪問者(Visitor)舉例

訪問者模式表示一個作用於對象結構中各元素的操作,定義這個操作並不會改變元素的類。這種模式可以在出租車公司的運轉中觀察到。當一個人給出租車公司打電話時,他(她)就成了公司所有顧客的一員。然後公司指定一輛車去服務(接受訪問者)。在進入出租車之後,這個人(訪問者)就不再控制他(她)的旅程了,而是由出租車(駕駛員)負責。



意義

軟體設計模式有許多非軟體的例子存在。也許有人想知道這些例子的實際意義。非軟體例子有助於增進模式語言的表達力和輔助模式的學習。

增加模式語言的表達能力

Alexander覺得真正的模式要融入一種通用的語言以便所有人都能夠分享。在軟體設計的人群中,模式被認為是在同事之間一種約定俗成的開發方式。模式提供了一種比模組、過程和對象更高層次的概念。

一種語言中至關重要的因素是同語言形象所對應的心靈影像。在一種語言中,僅當一個人能夠領會一個符號的含義,能夠在心裡描繪出這種含義時,這個符號的外形才是有意義的。Alexander沒有忽視模式語言的這種重要特徵,他規定:一種語言只有在它所產生的建築類型能夠被具體地看到之後,這種語言才是完全形態化的。在軟體設計中,Richle和Züllighoven認識到具體的例子在指導我們對應用領域的理解的重要性。

如果軟體設計模式成為程式員中通用的語言,其基礎則是統一的含義。如果設計決定下達了,但是沒有被理解,則設計師被迫通過假設來完成工作。平凡的例子更便於理解,其原因在於人們必須在記憶中找到相關聯的內容才能夠理解。在廣泛使用模式的AG Communication Systems公司的項目中,常常使用非軟體例子來解釋模式之間的關係。這個例子有助於在設計師間提供統一的理解。通過在設計過程的先期建立統一的理解,使得在整個專案生命週期中,設計師間的溝通更加容易。

結論

在非軟體例子中軟體設計模式的體現表明了模式不是局限於特定領域的。軟體設計師可以從這些日常事物的模式舉例中受益,哪怕這些例子並不是以程式設計語言表達的。這篇文章儘可能舉一些大部分人所熟悉的例子(儘管某些傾向於北美文化)。通過對共同的經曆的描述,這些例子有助於對特定的設計模式的理解,並且能夠協助對設計模式的學習。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.