讀了大話設計模式一書.暫做總結,有的理解了,有的還不太理解,以后慢慢理解
1.簡單工廠模式
概念: 根據不同的條件初始化不同的對象
加減運算來說,聲明一個運算類,然后各種運算都繼承它,就是一種簡單的工廠模式,雖然不見得就多好,講的是這種思想
加上一個初始化控制邏輯,就是工廠模式,根據不同的條件初始化不同的對象
2.策略模式
概念:算法的封裝,算法的工廠模式
它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶
看了半天,感覺就是工廠模式的升級版,,把計算部分做成了工廠模式
3.裝飾模式
概念:在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
繼承并添加一些方法.不給原類擴展,只添加在子類上
原類不需要知道這些方法和擴展.
4.代理模式
算是最常用的模式之一了吧,規定協議方法,設置代理,用代理執行協議
5.工廠方法模式
概念:封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品
父類給接口(協議)
在代理方法中初始化子類
子類再次使用工廠模式調用方法
有點胡
就是把判斷工廠類型這一步,判斷type這一步放在了代理里判斷
寫代理的時候再初始化
6.原型模式
概念:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
就是給類一個clone方法,方便類的復制
淺復制 只復制了指針地址
深復制 新開的地址,都復制了
7.模板方法模式
重寫父類的方法
重復 = 易錯 + 難改
利用了多態,子類重寫父類的方法,利用父類的一些邏輯而減少代碼量
8.外觀模式
概念:為子系統中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統更加容易使用。
感覺就是tableview的那種代理形式,把具體的子視圖通過代理拋出來
9.建造者模式 又叫生成器模式
概念:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
把一個復雜的對象的構建與它的表示分離,讓同樣的建造過程可以創建不同的表示意圖
用戶只需要制定類型就可以得到對象,而不用管具體的過程和細節
就是封裝初始化方法嘍,有時候需要一個指揮者,就是xx所謂的loginhelper嘍
10.觀察者模式
概念:觀察者模式(有時又被稱為發布(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統
觀察者模式也就是所謂的KVO
監聽 發現變化后調用方法
怎么實現的?在set方法中加了幾行
觀察和被觀察的對象都是抽象的
通知者 被通知者
被觀察者 觀察者(保留了被通知者的集合) 被通知者(遵循某協議或某父類)
11.抽象工廠模式
概念 : 抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統所需要的,僅僅是類型與這些抽象產品角色相同的一些實例,而不是這些抽象產品的實例。換言之,也就是這些抽象產品的具體子類的實例。工廠類負責創建抽象產品的具體子類的實例。
抽象工廠模式就是對數據的抽象,也就是數據的訪問給他建立一個父類
通過多態來初始化不同的數據,抽象了數據層
12.狀態模式
概念:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類
不同的狀態設置不同的參數,在類中走不同的方法
多個不同的設置,從而看起來同一個類同一個方法卻不像同一個類
13.適配器模式
概念: 將一個類的接口適配成用戶所期待的。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
當我們要使用一個原有的類得接口
但是它和我們的類的要求不同的時候
我們可以建立一個中間類,來吧接口進行封裝(有用過)
然后通過這個類提供的接口進行訪問
14.備忘錄模式
概念: 在不破壞封裝性的前提下
保存對象的內部狀態
這樣可以將對象恢復到原先保存的狀態
就是建立一個備忘錄類
把對原類的封裝細節給他,然后他負責備份并且提供到處導入方法
15.組合模式
概念:將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。掌握組合模式的重點是要理解清楚 “部分/整體” 還有 ”單個對象“ 與 "組合對象" 的含義。
樹狀圖的部分整體結構
同一個對象擁有樹狀圖的 父親 兒子 兄弟等.這樣就是完整的組合模式
如果我們需要安全一點,可以把它的節點封裝成方法
根據不同的節點提供不同的方法
通知可以利用多態,不同的節點擁有不同的子類
不同的子類有不同的方法
但是他們都擁有節點,通過方法添加關系
`組合模式的標志就是 樹狀圖`
16.迭代器模式
概念:提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內部表示。
提供一個能訪問局和對象的方法
這個方法可以不暴露私有成員
當一個聚合對象(我理解為容器,有多個成員)
有多種方式進行遍歷的時候
我們需要為聚合對象 提供以下接口
開始 下一個 石佛結束 當前的index 等接口
而不是把成員都暴露在外,讓客戶端進行查詢和修改,這是不安全的
其實就是一個OC基本數據類型的實現
17.單例模式
概念: 保證只有一個實例,并且提供一個可以訪問他的全局訪問點
首先 懶加載的概念.避免對象重新初始化
單例是在懶加載的基礎上對整個類的懶加載并且把它駐留在內存中
隨時可以調用
向外拋出一個獲得單例的方法,而不是每次都使用初始化方法
多線程訪問單例可能會造成多個初始化,這個時候我們需要線程鎖來保護,GCD已經幫我們做了,注意線程鎖加載nil判斷里.不用每次訪問都添加線程鎖
靜態變量
惡漢式初始化, 一開始就初始化
懶漢式單例類 到結束的時候才初始化
18.橋接模式
概念:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。
首先我們有一個原則,就是繼承不能有太多層次
優先使用聚合關系(擁有)
實現指的是抽象類和它的派生類用來實現自己的對象然后在它的抽象中提供對外的接口
比如手機品牌和手機游戲
手機游戲就是實現 手機品牌就是抽象
我們把手機游戲的實現單獨拿出來,然后針對不同的品牌做接口
現在的游戲都是使用游戲引擎單獨開發的,開發出來在針對不同的系統平臺做接口
但是核心實現是一套
19.命令模式
概念:將一組行為抽象為對象,實現二者之間的松耦合。這就是命令模式(Command Pattern)。
把一個請求封裝為一個對象
這個對象有一個日志
有命令隊列
并且命令隊列可以根據執行狀態進行回絕
這個對象就是服務員
服務員記錄菜單,通知做菜的師傅, 統計菜單,統計命令,執行刪除和回絕等任務.
20.職責鏈模式
多個對象都有機會處理請求
沿著鏈路傳遞請求,直到有一個能處理它為止
就是父類定義一個處理請求的方法
所有子類都繼承了這個方法
子類可以選擇向上傳遞,或者自己處理
客戶端不需要誰來處理鏈路請求
鏈路中的對象不需要知道鏈路的結構
客戶端傳遞請求的時候直到一個對象處理
21.中介者模式
系統作為一個整體,對系統的修改往往比較困難
用一個中介對象
來進行類和類之間的引用操作
就是所謂的viewmodel 其實
把引用從每個對象之間分離
對象只需要拋出方法就行了
中介者可以讓我們從對象的本身轉移到對象的交互上來
更宏觀的觀察各個對象
優點就是集中控制
缺點同上
就是所謂的manager
22.享元模式
概念:它使用共享物件,用來盡可能減少內存使用量以及分享資訊給盡可能多的相似物件;它適合用于只是因重復而導致使用無法令人接受的大量內存的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部數據結構,當需要使用時再將它們傳遞給享元
一些代碼邏輯是可以共享的
享元模式分為內部狀態和外部狀態,其中內部狀態是高度一致的代碼邏輯,外部狀態通常是每個對象的區別,他們共同組成一個享元對象
比如網站
核心代碼+用戶信息類
23.解釋器模式
如果一種特定類型的問題發生的頻率足夠高
那么可能就值得將訪問這個問題的實例來表述為一個簡單的句子
這樣就可以構建一個解釋器(讓我想起了枚舉)
正則表達式
就是給一個句子或者語法
通過它來執行操作
24.訪問者模式
寫分類