1. 程式人生 > >Java的設計模式(一)

Java的設計模式(一)

初始化 關心 主體 編程 開發 私有 獲得 避免 style

什麽是設計模式?

設計模式其實是組織代碼方式的一種經驗,由前人在開發中整理歸納出來。

oo設計原則

在oo設計中應該遵循的幾個原則:

  • 封裝變化。即將需要變化的部分與固定不變的部分隔離開,如抽象類中的抽象方法,要求每個子類去實現,這是變化的部分。
  • 多用組合,少用繼承。組合即一個對象has其他對象。
  • 針對接口編程,不針對具體實現編程。接口在java中指的是超類(Supertype),包括抽象類和接口(interface),具體體現在當需要new以對象時,聲明成其父類或接口類型。
  • 努力設計出交互對象中的松耦合。松耦合即最大限度的“不了解對方”,只知道對方的接口類型和接口中定義的方法,觀察者模式就是很好的例子。
  • 對擴展開放,對修改關閉。繼承其實也是擴展的一種方式,當需要擴展新類型時,繼承父類即可;而對修改關閉,說的是不要改動原來的代碼,原來的代碼已經組織得很好了,不需要改動。
  • 依賴抽象,不要依賴具體類。這條原則我感覺跟“針對接口編程”是一樣的,抽象的結果必定是個接口,而依賴抽象,實際就是針對接口編程。

設計模式

  • 策略模式。策略模式是指將程序中經常需要變化的行為(稱為算法族)封裝起來,讓這些算法族之間可以相互替換。具體方式是將需要變化的行為獨立成一個接口,由子類去實現其變化的功能。而主體則has一個該接口對象。這種組合方式可以使主體的行為可以動態改變,同時避免了繼承帶來的缺點。例如飛行的行為之於鴨子接口,並不是每種鴨子都會飛的且每種鴨子飛行的姿態不一樣,所以將飛行的行為獨立出來成為一個接口,由鴨子的具體實現類去實現該接口,而鴨子接口則has飛行接口對象,這時,飛行這一算法族就被獨立出來了。同時,我們也可以看到組合對象的好處。
  • 觀察者模式。觀察者模式發生在需要交互的兩類對象之間,分別稱為主題和觀察者。拿賣報舉例,主題是報紙的,觀察者是閱讀者。閱讀者希望報紙有了新消息就接到通知。主題中有一個容器保存著它的觀
    查者對象,當自身狀態發生改變時就通知觀察者。java庫中有observeable這個抽象類,主題要繼承這個類。觀察者則實現observer這個接口。
  • 裝飾者模式。裝飾者模式是給原材料增加一些新功能。所謂的原材料是指和裝飾者擁有同一個超類的具體實現類。層級結構如下圖

    技術分享圖片
    其中原材料指的是四個具體飲料組件,而裝飾者是調料。當中的裝飾者都has一個被裝飾者的超類指針。這裏用到的繼承只是為了得到合適的引用類型,讓裝飾者可以一層套一層地裝飾對象。
  • 工廠方法模式。工廠,顧名思義,就是生產產品的地方,把生產產品的任務交給某個工廠,不必去關心生產的具體產品類型。要實現工廠方法,首先要有一個創建者。通常是超類,還有就是要有產品
    的接口。超類操縱產品接口,留有一個抽象的方法,該方法用來創建具體的產品類型,交由其子類去實現。每一個超類的子類實現該抽象方法時,都要創建一個具體的產品類型。
  • 抽象工廠模式。抽象工廠提供了一個接口,用來創建相關的一組相關的產品。抽象工廠模式利用工廠方法作為基礎,每個方法創建一個產品,所以能創建多個相關的產品。抽象工廠與工廠方法相比,就是全職和兼職的區別。抽象工廠專門提供接口來生產產品,而工廠方法只是作為子類中的一部分。兩者都是交由其子類去創建具體類。
  • 單件模式。單件模式是為了確保某個類的對象只有唯一的一個。要實現單件模式,首先將該類的構造器變為私有,並且在該類中保有一個該類的靜態變量和返回值是該類型的一個靜態方法。靜態方法是全局訪問點,其他地方想要獲得該類的實例就得調用該方法。如下圖所示。

    技術分享圖片

    但是,這樣會在面臨多線程時出問題。在多線程時可能會創建出幾個不同的對象。要解決這個問題。有三種方法
  1. 同步。直接在靜態方法上加上關鍵詞synchronize。但是會犧牲性能。
  2. 急切實例化。即在該類中定義靜態成員變量時就直接初始化。
  3. 雙重檢查加鎖。該技巧可以保證只有在第一次創建實例時才會同步。不會對性能造成影響。
    技術分享圖片

Java的設計模式(一)