摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個人認(rèn)為核心是如何解耦。再根據(jù)信息流劃分出對象在系統(tǒng)中擔(dān)任的種角色,。所以歸為一種核心所有的的職責(zé)都是控制。
Overview
今天看了YouTube上的一個講Design Pattern的視頻,把這個視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。
大意就是作者把22種Design Pattern不斷的重組歸納抽象直道最后抽象為一種設(shè)計模式,Mediator。
而所有的Design Pattern關(guān)注的核心問題就是如何控制信息流(但是我個人認(rèn)為核心是如何解耦)。再根據(jù)信息流劃分出對象在系統(tǒng)中擔(dān)任的5種角色,Representer, Doer, Dispatcher, Translator, Maker。
大概就是以上的內(nèi)容,但是具體如何實踐還不太清楚。。。
GoF Design Pattern分類 v.s 作者分類
Creational | Structural | Behavioral | |
---|---|---|---|
Shim | Abstract Factory Object Pool Prototype |
Flyweight |
Iterator Null Object |
Compositional | Builder |
Adapter Composite Decorator Facade Proxy |
Interpreter Mediator Observer |
Decompositional | Factory Method | Bridge Composite Proxy |
Chain of Responsibility Command Mediator Memento Observer Strategy Template Method |
如表格所示,GoF把26種設(shè)計模式分為了Creational, structural和Behavioral三大類。
而作者把設(shè)計模式按照Shim, Compsitional, Decompsitional分類
Shim Patterns: 編程語言不能處理當(dāng)前情況
例子:iterator模式,沒有其他的方法能夠更方便的遍歷對象的時候,就會使用iterator模式。
Compositional Patterns:要把一系列的object組合在一起
Decompositional Patterns: 要把一個object拆分成多個object
要注意的是有些模式在多個分類里, 比如Mediator既可以用于組合模式又可以用于拆分模式。
由于現(xiàn)有的26種模式,有些模式彼此之間很難分辨區(qū)別。
如: Adapter, Facade, Bridge, Decorator, Proxy
如圖所示,UML結(jié)構(gòu)相同。
代碼例子:
Adapter
要把已有的系統(tǒng)watchdog插入系統(tǒng)PSRLogger中,在log函數(shù)中,舊的接口(watchdog)被轉(zhuǎn)換成了新的接口(log)。
用這個方法可以把watchdog插入任何系統(tǒng)。
phpuse PsrLogLoggerInterface as Log class PSR3Logger implements Log { public function log ($level, $msg, array $ctx = array()) { $severity = $this->convertLevelToSeverity($level); watchdog("unknown", $msg, $ctx, $severity); } /* ... */ }
Facade
把一個復(fù)雜的系統(tǒng)轉(zhuǎn)換成一個簡單的接口。
phpclass EntityMetadataWrapper { public function __construct($type, $data = null, $info = array()) { $this->type = $type; $this->info = $info + array( "langcode" => null, ); $this->info["type"] = ¥type; if (isset($data)) { $this->set($data); } } /* ... */ }
抽象一下過程
把已有代碼用于其他代碼中,而設(shè)計模式提供的就是這個轉(zhuǎn)化的過程
由于結(jié)構(gòu)相同,差別比較細(xì)微,把這5種歸為一種,用adapter作為代表。
同理把其他design pattern按UML相似合并,有以下表格
Creational | Structural | Behavioral | |
---|---|---|---|
Compositional | Adapter Composite |
Mediator Observer |
|
Decompositonal | Adapter Composite |
Observer |
這里除去重復(fù)的只有6種pattern。
Adapter - This has a single class which makes one or more other classes behave as a single interface.
Composite - This abstracts a recursive structure.
Command - This abstracts determination of execution from actual execution
Mediator - This abstracts communication between several objects
Memento - This abstracts state representation from execution
Observer - This abstracts communication between two objects
如果按照Information Flow的傳遞來分,有三種
Controlling Information Flow Between Multiple Systems (多系統(tǒng)間)
Controlling Information Flow Within An Individual System (單系統(tǒng))
Controlling Information Flow Between Individual Objects (object之間)
De-Duplicated Re-Groupings下面開始繼續(xù)簡化
Multiple Systems? | Single System? | Single Objects? | |
---|---|---|---|
Information Flow? | Mediator | Command | Observer |
Structure | Adapter | Composite | Memento |
注意:information flow 和 structure是相對的。
再簡化
DeDe-Duplicated Re-GroupingsPattern | |
---|---|
Information Flow? | Mediator |
Structure | Adapter |
最終簡化
DeDe-Duplicated ReRe-Groupingsinformation flow和structure其實是一種概念的不同表達(dá)形式,例如list,可以傳遞信息作為input,output,也可以作為一種數(shù)據(jù)結(jié)構(gòu)。所以歸為一種
Pattern | |
---|---|
Information Flow? | Mediator |
核心:
所有的Design Pattern的職責(zé)都是控制information flow。
然而故事到這里并沒有完。
下面關(guān)于information flow還有l(wèi)ogic(變量)和message(即input和output,可以是string,array,object等等)的區(qū)別
Logic | Hybrid | Message | |
---|---|---|---|
Purpose | Behavior | General Code | State |
State | Stateless | Stateful | Stateful |
Paradigm | Functional | OOP? | Data |
信息流的傳遞方式可以歸納為三種:Ask(類似get方法), Tell(類似set方法), Translate(input=>output).
Ask$msg = $obj->something();
Logic | Hybrid | Message |
---|---|---|
No | Yes | Yes |
$obj->something($msg);
Logic | Hybrid | Message |
---|---|---|
No | Yes | Yes |
$msg2 = $obj->do($msg1);
Logic | Hybrid | Message |
---|---|---|
Yes | Yes | No |
Note:
ask總是有狀態(tài)
tell總是有狀態(tài)
translate可以是有狀態(tài)也可以是無狀態(tài)的
Object Role Patterns按Object角色role來分,一共5種:Representer, Doer, Dispatcher, Translator, Maker
Representerphpclass User { public function getName(); //ask public function isAdmin(); public function setName($name); //tell }Doer
phpclass EmailSystem { /** * @return boolean */ public function send(Message $msg); //tell }Dispatcher
phpclass Controller { /** * @return Response */ public function handle(Request $req); //translate }Translator
phpclass UserView { /** * @return string HTML */ public function render(User $user);//translate }Maker
phpclass UserFactory { /** * @return User a user object */ public function getUser();//ask }
State? | Logic? | Mode | |
---|---|---|---|
Representer | User | No | Ask/Tell |
Doer | No | Yes | Tell |
Dispatcher | System | No | Translate |
Translator | No | Yes | Translate |
Maker | System | Yes | Ask |
作者的開發(fā)經(jīng)驗得出有95%~99%的應(yīng)用可以用以上模式表達(dá)。
文章還會繼續(xù)修改,有興趣的同學(xué)可以直接觀看YouTube上的視頻,我在reference里面給出了鏈接,還有作者的blog,但是blog中只有前半部分內(nèi)容。
我個人對于design pattern的理解也很有限,希望各位大神賜教。另外關(guān)于一些單詞的具體含義,我只能意會不能言傳。。。如果有大神愿意仔細(xì)解讀的話,可以留言。
同步更新在我的gitbook筆記中。
Beyond Design Pattern 視頻
視頻作者blog
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21004.html
摘要:首先聲明一下,和兩者關(guān)系不大,主要是團(tuán)隊之前一直用構(gòu)建工具,這幾天業(yè)務(wù)上比較清閑,老大讓我學(xué)學(xué)新的和這些潮流工具,于是草草研究了一天,記一些筆記。最后使用將各個組件打包在一起。 首先聲明一下,gulp和webpack兩者關(guān)系不大,主要是團(tuán)隊之前一直用grunt構(gòu)建工具,這幾天業(yè)務(wù)上比較清閑,老大讓我學(xué)學(xué)新的gulp和webpack這些潮流工具,于是草草研究了一天,記一些筆記。 gulp...
摘要:在地球上最大的中介者就是聯(lián)合國了,它主要用來維護(hù)國際和平與安全解決國際間經(jīng)濟(jì)社會文化和人道主義性質(zhì)的問題。所以對于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對象之間的關(guān)聯(lián)關(guān)系,使之成為一個松耦合系統(tǒng),我們就需要使用中介者模式。 中介者模式(Mediator Pattern)屬于行為型模式的一種,用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨...
摘要:工廠設(shè)計模式工廠設(shè)計模式,主要用于進(jìn)行實例化對象時的解耦操作,避免使用關(guān)鍵字實例化對象,通過反射,根據(jù)類名稱動態(tài)創(chuàng)建對象示例靜態(tài)工廠模式構(gòu)造方法私有化獲取指定類名稱的對象動態(tài)代理模式動態(tài)代理模式,主要用于對同一接口子類的相同邏輯進(jìn)行代理操作 工廠設(shè)計模式 工廠設(shè)計模式,主要用于進(jìn)行實例化對象時的解耦操作,避免使用new關(guān)鍵字實例化對象,通過反射,根據(jù)類名稱動態(tài)創(chuàng)建對象 示例: pa...
摘要:創(chuàng)建型模式主要有以下五種簡單工廠模式和工廠方法模式抽象工廠模式單例模式建造者模式原型模式在設(shè)計模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式。 一、 設(shè)計模式(Design pattern)是什么 設(shè)計模式是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過分類編目的代碼設(shè)計的經(jīng)驗總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 二、 為什么會有設(shè)計模式 在軟件開發(fā)過...
摘要:設(shè)計模式目的為了代碼可重用性讓代碼更容易被他人理解保證代碼可靠性設(shè)計原則設(shè)計原則是設(shè)計模式為了達(dá)到其目的,所實現(xiàn)的一些準(zhǔn)則。 設(shè)計模式簡介 1.什么是設(shè)計模式 設(shè)計模式對是經(jīng)驗的總結(jié),是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。代表了最佳的實戰(zhàn)。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...
閱讀 775·2023-04-25 16:55
閱讀 2804·2021-10-11 10:59
閱讀 2070·2021-09-09 11:38
閱讀 1782·2021-09-03 10:40
閱讀 1485·2019-08-30 15:52
閱讀 1125·2019-08-30 15:52
閱讀 954·2019-08-29 15:33
閱讀 3494·2019-08-29 11:26