北京建筑公司有哪些seo教程網(wǎng)
一、概念
分為三大類、23中具體設(shè)計模式。
類型 | 原理 | 具體模式 |
創(chuàng)建型 | 封裝了具體類的信息,隱藏了類的實例化過程。 | 單例模式(Singleton) 工廠方法模式(Factory Method) 抽象工廠模式(Abstract Factory) 建造者模式(Builder) 原始模式(Prototype) |
結(jié)構(gòu)型 | 類結(jié)構(gòu):采用繼承機制來組合接口實現(xiàn)。 對象結(jié)構(gòu):組合對象來實現(xiàn)新功能。 | 適配器模式(Adapter) 代理模式(Proxy) 門面模式(Facade) 橋梁模式(Bridge) 裝飾模式(Decorator) 合成模式(Composite) 享元模式(Flyweight) |
行為型 | 類行為:使用繼承關(guān)系在幾個類之間分配行為。 對象行為:使用對象聚合的方式來分配行為。 | 觀察者模式(Observer) 策略模式(Strategy) 模板方法模式(Template Method) 命令模式(Command) 迭代器模式(Iterator) 調(diào)停者模式(Mediator) 狀態(tài)模式(State) 責任鏈模式(Chan Of Responsibility) 訪問者模式(Visitor) 備忘錄模式(Memento) 解釋器模式(Interpreter) |
二、創(chuàng)建型
模式 | 說明 | 解決的問題 | 原理 | 備注 |
單例模式 | ●實現(xiàn)一個類只有一個實例 ●提供一個全局訪問點 | 保證一個類只有一個對象,降低對象之間的耦合度。 | ①私有化構(gòu)造方法。 ②創(chuàng)建私有變量在內(nèi)部實例化。 ③定義公共方法供外部獲取唯一實例。 | 懶漢式、餓漢式、枚舉、靜態(tài)內(nèi)部類 |
簡單工廠模式 | 將“類實例化的操作”和“使用對象的操作”分開。 | 使用這可以直接實例化多個類對象而不需要知道其創(chuàng)建細節(jié)。 | 創(chuàng)建工廠類提供靜態(tài)方法,根據(jù)傳入不同參數(shù)而返回不同產(chǎn)品類的實例。 | - |
工廠方法模式 | 優(yōu)化簡單工廠模式中的問題:工廠一旦需要生產(chǎn)新產(chǎn)品就需要修改工廠類的方法邏輯,違背了“開放-關(guān)閉”原則。 | 將類的實例化(具體產(chǎn)品的創(chuàng)建)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應(yīng)該實例化哪一個產(chǎn)品類。 | 在添加新的產(chǎn)品時就不用修改工廠邏輯而是添加新的工廠子類。 | |
抽象工廠模式 | 優(yōu)化工廠方法模式中的問題:一個具體工廠只能創(chuàng)建一種產(chǎn)品,實際生活中一個工廠往往需要生產(chǎn)多種產(chǎn)品。 | 使用接口來創(chuàng)建一組相關(guān)產(chǎn)品,而不需要關(guān)心實際生產(chǎn)出的產(chǎn)品具體是什么,以此達到解耦。 | - | |
建造者模式 | 隱藏創(chuàng)建對象的過程和細節(jié),在不知道這些的情況下就可以直接創(chuàng)建復(fù)雜的對象。 | ●降低創(chuàng)建單個復(fù)雜對象的難度 ●隔離復(fù)雜對象的創(chuàng)建和使用 | 封裝了創(chuàng)建復(fù)雜對象的過程,只需要指定類型和內(nèi)容。 | ●建造者以簡化創(chuàng)建單個復(fù)雜對象為目的 ●工廠以簡化創(chuàng)建多個對象為目的。 |
三、結(jié)構(gòu)型
模式 | 說明 | 解決的問題 | 原理 | 備注 |
適配器模式 | 定義一個包裝類用于包裝不兼容接口的對象。 | 把一個類的接口變換成客戶端鎖期待的另一種接口,從而是原本不匹配而無法一起工作的兩個類能夠在一起工作。 | 把要適配類的API轉(zhuǎn)為目標類的API,類適配器模式使用繼承關(guān)系,對象適配器模式使用委托關(guān)系。 | ●靈活使用時:選擇對象適配器模式 ●需要同時適配源類和其子類:選擇對象適配器 ●需要重新定義Adapter的部分行為:選擇類適配器 ●僅僅希望食用方便時:選擇類適配器模式 |
門面模式 | 定義一個更高層的統(tǒng)一接口,外部通過這個接口對子系統(tǒng)中的一群接口進行訪問。 | ●避免了系統(tǒng)和系統(tǒng)之間的高耦合度 ●使得復(fù)雜的子系統(tǒng)用法變得簡單,提高了客戶端的使用便捷性,無需關(guān)心子系統(tǒng)工作細節(jié),通過門面角色即可調(diào)用相關(guān)功能。 | 創(chuàng)建一個統(tǒng)一的門面類,用來包裝子系統(tǒng)中一個或多個復(fù)雜的類,客戶端通過該門面類的方法來調(diào)用子系統(tǒng)中所有的方法。 | ●適配器模式:將一個對象包裝起來以改變其接口,為的是轉(zhuǎn)換接口。 ●門面模式:將一群對象“包裝”起來以簡化其接口,為的是簡化接口的使用。 |
代理模式(靜態(tài)&動態(tài)) | 為目標對象設(shè)置一個代理對象,由代理對象調(diào)用目標對象的方法,通過訪問代理對象達到間接訪問目標對象的效果。 | 防止直接訪問目標對象帶來的復(fù)雜性和安全問題。 | 外接訪問代理對象,代理對象內(nèi)部創(chuàng)建并調(diào)用目標對象。 | ●遠程代理:為一個對象在不同地址空間提供局部代表。 ●虛擬代理:通過一個開銷小的對象代理一個開銷大的對象。 ●保護代理:控制目標對象的訪問保護目標對象。 |
使用時才創(chuàng)建動態(tài)代理類和實例。通過反射動態(tài)調(diào)用目標對象的方法。 | 解決靜態(tài)代理在目標對象較多的情況下,一個靜態(tài)對象只能代理一種目標目標對象而出現(xiàn)靜態(tài)代理對象量多、代碼量大,從而導(dǎo)致代碼變復(fù)雜的問題。 | ●設(shè)計動態(tài)代理(DynamicProxy)時不需要顯示實現(xiàn)與目標對象(RealSubject)相同的接口,而是將這種實現(xiàn)推遲到程序運行時由JVM來實現(xiàn)。 ●通過Java反射機制的method.invoke(),通過調(diào)用動態(tài)代理類對象方法,從而自動調(diào)用目標對象的方法。 | ●靜態(tài)代理場景下需要代理對象數(shù)量較多的情況下使用動態(tài)代理。 ●AOP領(lǐng)域面向切面變成。 |
四、行為型
模式 | 說明 | 解決的問題 | 原理 | 備注 |
策略模式 | 定義一系列算法,將每個算法封裝到具有公共接口的一系列策略類中。 | 解耦算法本身和其責任,使得客戶端方便根據(jù)外部條件選擇不同策略來解決問題,算法可獨立于使用者而變化。 | ●定義抽象策略類角色(Strategy) ●定義具體策略角色(Concrete Strategy) ●定義環(huán)境角色(Context)用于連接上下文,即根據(jù)參數(shù)設(shè)置不同策略。 | 用于動態(tài)選擇多重復(fù)雜算法的場景。 |
觀察者模式 (發(fā)布訂閱模式) | 定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴它的對象都將收到通知并做出響應(yīng)。 | 解耦常變對象與不常變對象之間的依賴關(guān)系(如常變的UI和不常變的業(yè)務(wù)邏輯)。 | ●觀察者只需要實現(xiàn) Observer 接口把自己注冊到 Subject 中,就能收到事件消息。 ●被觀察者(Observable)通過訂閱(Subscribe)按順序發(fā)送時間給觀察者,觀察者按順序接收時間并做出響應(yīng)。 | ●推模型:不管觀察者是否需要都推送主題的詳細信息。 ●拉模型:若觀察者需要更具體的信息,由觀察者主動到主題主題對象中獲取。 |
模板方法模式 | 定義一個模板結(jié)構(gòu),將具體內(nèi)容延遲到子類去實現(xiàn)。 | 實現(xiàn)了反向控制,通過父類調(diào)用其子類的操作,通過對子類的具體實現(xiàn)擴展不同的行為。 | 將相同部分的代碼放在抽象的父類中,將不相同的代碼放入不同的子類中。 | 一次性實現(xiàn)一個算法的不變部分,將可變的行為留給子類來實現(xiàn)。 |