淺談設計模式

前言

在這篇文章中,我主要講述如下內容:java

  • 引言
  • 設計模式的誕生與發展
  • 設計模式的定義與GoF23種設計模式
  • 設計模式的優勢

引言

從兩個實例提及:

1. 實例一

實例說明算法

某軟件公司要開發一個跨平臺圖像瀏覽系統,要求該系統可以顯示BMP、JPG、GIF、PNG等多種格式的文件, 而且可以在Windows、Linux、Unix等多個操做系統上運行。系統首先將各類格式的文件解析爲像素矩陣(Matrix),而後將像素矩陣顯示在屏幕上,在不一樣的操做系統中能夠調用不一樣的繪製函數來繪製像素矩陣。設計模式

設計方案 ide

問題函數

  • 採用了多層繼承結構,致使系統中類的個數急劇增長,具體層的類的個數 =所支持的圖像文件格式數×所支持的操做系統數;
  • 系統擴展麻煩,不管是增長新的圖像文件格式仍是增長新的操做系統,都須要增長大量的具體類,這將致使系統變得很是龐大,增長運行和維護開銷。

2. 實例二

實例說明學習

•某軟件公司爲某電影院開發了一套影院售票系統,在該系統中須要爲不一樣類型的用戶提供不一樣的電影票打折方式,具體打折方案以下:測試

(1)學生憑學生證可享受票價8折優惠;ui

(2)年齡在10週歲及如下的兒童可享受每張票減免10元的優惠(原始票價需大於等於20元);this

(3)影院VIP用戶除享受票價半價優惠外還可進行積分,積分累計到必定額度可換取電影院贈送的獎品。spa

注意:該系統在未來可能還要根據須要引入新的打折方式。

設計方案

public class MovieTicket{
  private double price;
  
  //compute the price
    public double calculate(String type) {
        //student ticket
        if(type.equalsIgnoreCase("student")) {
            return this.price * 0.8;
        }
        //children ticket
        else if(type.equalsIgnoreCase("children") && this.price >= 20 ) {
            return this.price - 10;
        }
         //VIP ticket
        else if(type.equalsIgnoreCase("vip")) {
            //add points, code is omitted
            return this.price * 0.5;
         }
        else {
            return this.price; 
        }
    }
}
複製代碼

問題

(1) MovieTicket類的calculate()方法很是龐大,它包含各類打折算法的實現代碼,在代碼中出現了較長的條件轉移語句,不利於測試和維護;

(2) 在增長新的打折算法或者對原有打折算法進行修改時必須修改MovieTicket類的源代碼,系統的靈活性和可擴展性較差;

(3)算法的複用性差,若是另外一個系統須要重用某些打折算法,只能經過對源代碼進行復制粘貼來重用,沒法單獨重用其中的某個或某些算法。

設計模式的誕生與發展

設計模式的誕生

  • 設計模式起源於建築業而非軟件業
  • 設計模式之父——美國加利佛尼亞大學環境結構中心研究所所長ChristopherAlexander博士
  • 《APattern Language: Towns, Buildings, Construction》——253個建築和城市規劃模式

設計模式的發展

  • 20世紀80年代末,軟件工程界開始關注ChristopherAlexander等在這一住宅、公共建築與城市規劃領域的重大突破;
  • 「四人組(Gang of Four,GoF,分別是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)」於1994年概括髮表了23種在軟件開發中使用頻率較高的設計模式,旨在用模式來統一溝通面向對象方法在分析、設計和實現間的鴻溝。

設計模式的定義與GoF23種設計模式

設計模式的定義

Alexander給出了關於模式的經典定義:

   每一個模式都描述了一個在咱們的環境中不斷出現的問題,而後描述了該問題的解決方案的核心,經過這種方式,人們能夠無數次地重用那些已有的解決方案,無須再重複相同的工做。

通俗理解:模式是在特定環境下人們解決某類重複出現問題的一套成功或有效的解決方案

GoF23種設計模式

備註:建立型模式主要是用於建立對象,結構性模式主要用於處理類或對象的組合,行爲型模式主要用於描述類或對象怎樣交互和怎樣分配職責

設計模式的優勢

  • 融合了衆多專家的經驗,並以一種標準的形式供廣大開發人員所用;
  • 提供了一套通用的設計詞彙和一種通用的語言,以方便開發人員之間進行溝通和交流,使得設計方案更加通俗易懂;
  • 讓人們能夠更加簡單方便地複用成功的設計和體系結構;
  • 使得設計方案更加靈活,且易於修改;
  • 將提升軟件系統的開發效率和軟件質量,且在必定程度上節約設計成本;
  • 有助於初學者更深刻地理解面向對象思想,方便閱讀和學習現有類庫與其餘系統中的源代碼,還能夠提升軟件的設計水平和代碼質量。

小結

   本文只是對設計模式進行了一個概述,具體經常使用的23種設計模式須要讀者業餘時間慢慢學習,同時須要知道的是在未來的軟件設計與開發中使用設計模式,是一個成功的軟件工程師必備的技能,這也正是咱們學習設計模式的目的。

參考資料:Java設計模式——劉偉編著

相關文章
相關標籤/搜索