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