PS:如下皆爲閱讀《設計模式-可複用面向對象軟件的基礎》ISBN:978-7-111-07575-2 的筆記編程
1.尋找合適的對象設計模式
面向對象程序由對象組成。對象包括數據和對數據進行操做的過程,過程一般稱爲方法或操做。對象再收到客戶的請求(或消息)後,執行相應的操做。ide
客戶請求是使對象執行操做的惟一方法。操做又是對象改變內部數據的惟一方法。因爲這些限制,對象內部狀態是被封裝的,它不能被直接訪問,它的表示對於對象外部是不可見的。性能
面向對象設計最困難的部分是將系統分解成對象集合。由於要考慮許多因素:封裝、粒度、依賴關係、靈活性、性能、演化、複用等等。ui
設計方法:a.寫出一個問題描述,挑出名詞和動詞,進而建立相應的類和操做;b.關注與系統的協做和職責關係;c.對現實世界建模,再將分析時發現的對象轉化至設計中。。。設計
2.決定對象的粒度對象
對象在大小和數目上變化極大。它們能表示下自硬件或上自整個應用的任何事物。參考模式:Facade,Flyweight,Abstrace Factory,Builer...繼承
3.指定對象接口接口
型構(signature):對象聲明的每個操做指定操做名、做爲參數的對象和返回值,這就是所謂的操做的型構。it
接口(interface):對象操做所定義的全部操做型構的集合被稱爲該對象的接口。ps:在面向對象系統中,接口是最基本的組成部分。對象只有經過他們的接口才能與外部交流,若是不經過對象的姐擴就沒法知道對象的任何事情,也沒法請求對象作任何事情。對象接口與其功能實現是分離的,不一樣對象能夠對請求作不一樣的實現。
類型(type):是用來標識特定接口的一個名字。例:若是一個對象接受「Window"接口所定義的全部操做請求,那麼咱們就說該對象具備」Window"類型。ps:一個對象能夠有許多類型,而且不一樣的對象能夠共享同一個類型。
子類型(subtype):當一個類型的接口包含另外一個類型的接口時,咱們就說它是另外一個類型的子類型。另外一個類型稱之爲它的超類型(supertype)。ps:咱們常說子類型繼承了它的超類型的接口。
動態綁定(dynamic binding):發送給對象的請求和它的相應操做在運行時刻的鏈接。指發送的請求直到運行時刻才受具體的實現的約束。
多態(polymorphism):動態綁定容許在運行時刻彼此替換有相同接口的對象,這種可替代性就稱爲多態。ps:它是面向對象系統中的核心概念之一。多態容許客戶對象僅要求其餘對象支持特定接口,廚藝以外對其假設幾近於無。
設計模式經過肯定接口的主要組成成分及經接口發送的數據類型,來幫助你定義接口。設計模式也指定了接口之間的關係。
4.描述對象的實現
對象的實現是由它的類決定的,類指定了對象的內部數據和表示,也定義了對象所能完成的操做。
對象經過實例化類來建立,此對象被稱爲該類的實例。當實例化類時,要給對象的內部數據(由實例變量組成)分配存儲空間,並將操做與這些數據聯繫起來。對象的許多相似實例是由實例化同一個類來建立。
欣的類能夠由已存在的類經過類繼承(class inheritance)來定義。當子類(subclass)繼承父類(parent class)時,子類包含了父類定義的全部數據和操做。子類的實例對象包含全部子類和父類定義的數據,且他們能完成子類和父類定義的全部方法。
抽象類(abstract class):主要目的是爲它的子類定義公共接口。一個抽象類將把它的部分或所有操做的實現延遲到子類中,所以,抽象類不能被實例化。
抽象操做(abstract operation):在抽象類中定義卻沒有實現的操做被稱爲抽象操做。
具體類(concrete class):非抽象類稱爲具體類。
子類可以改進和從新定義它們父類的請求,更具體的說,類可以重定義(override)父類定義的操做,重定義使得子類可以接管父類對請求的處理操做。
混入類(mixin class)是給其餘類提供可選擇的接口或功能的類。它與抽象類同樣不能實例化。
4.1.類繼承和接口繼承的比較
理解對象的類(class)與對象的類型(type)之間的差異很是重要。
一個對象的類定義了對象是怎樣實現的,同時也定義了對象的內部狀態和操做的實現。可是對象的類型只與它的接口有關,接口即對象能響應的請求的集合。一個對象能夠有多個類型,不一樣類的對象能夠有相同的類型。固然,對象的類和類型是有緊密關係的。由於類定義了對象所能執行的操做,也定義了對象的類型。當咱們說一個對象是一個類的實例時,即指該對象支持類所定義的接口。
類繼承根據一個對象的實現定義了另外一個對象的實現。接口繼承(或子類型化)描述了一個對象何時能被用來替代另外一個對象。
4.2對接口編程,而不是對實現編程
類繼承是一個經過複用父類功能而擴展應用功能的的基本機制。它容許你根據舊對象快速定義新對象。它容許你從已存在的類中繼承所須要的絕大部分功能,從而幾乎無需任何代價就能夠得到新的實現。繼承所擁有的定義具備相同接口的對象族的能力也是很重要的(一般能夠從抽象類來繼承),由於多態依賴於這種能力。
當繼承被恰當使用時,全部從抽象類導出的類將共享該抽象類的接口。這意味着子類僅僅添加或重定義操做,而沒有隱藏父類的操做。這時,全部的子類都能響應抽象類接口中的請求,從而子類的類型都是抽象類的子類型。
只根據抽象類中定義的接口來操縱對象有如下兩個好處:
a、客戶無需知道他們使用對象的特定類型,只需對象有客戶所指望的接口。
b、客戶無須知道他們使用的對象是用什麼類來實現的,他們只需知道定義接口的抽象類。
不將變量聲明爲某個特定的具體類的實例對象,而是讓它聽從抽象類所定義的接口。
5.運用複用機制