今天看了YouTube上的一個講Design Pattern的視頻,把這個視頻的大意給你們分享一下,該視頻的做者是Anthony Ferrara。
大意就是做者把22種Design Pattern不斷的重組概括抽象直道最後抽象爲一種設計模式,Mediator。
而全部的Design Pattern關注的核心問題就是如何控制信息流(可是我我的認爲核心是如何解耦)。再根據信息流劃分出對象在系統中擔任的5種角色,Representer, Doer, Dispatcher, Translator, Maker。php
大概就是以上的內容,可是具體如何實踐還不太清楚。。。html
GoF Design Pattern分類 v.s 做者分類
git
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種設計模式分爲了Creational, structural和Behavioral三大類。
而做者把設計模式按照Shim, Compsitional, Decompsitional分類
編程
要注意的是有些模式在多個分類裏, 好比Mediator既能夠用於組合模式又能夠用於拆分模式。設計模式
因爲現有的26種模式,有些模式彼此之間很難分辨區別。
如: Adapter, Facade, Bridge, Decorator, Proxy
如圖所示,UML結構相同。數據結構
代碼例子:
Adapter
要把已有的系統watchdog插入系統PSRLogger中,在log函數中,舊的接口(watchdog)被轉換成了新的接口(log)。
用這個方法能夠把watchdog插入任何系統。app
phpuse Psr\Log\LoggerInterface as Log class PSR3Logger implements Log { public function log ($level, $msg, array $ctx = array()) { $severity = $this->convertLevelToSeverity($level); watchdog("unknown", $msg, $ctx, $severity); } /* ... */ }
Facade
把一個複雜的系統轉換成一個簡單的接口。less
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); } } /* ... */ }
抽象一下過程
把已有代碼用於其餘代碼中,而設計模式提供的就是這個轉化的過程編程語言
因爲結構相同,差異比較細微,把這5種歸爲一種,用adapter做爲表明。
同理把其餘design pattern按UML類似合併,有如下表格函數
Creational | Structural | Behavioral | |
---|---|---|---|
Compositional | Adapter Composite |
Mediator Observer |
|
Decompositonal | Adapter Composite |
Observer |
這裏除去重複的只有6種pattern。
若是按照Information Flow的傳遞來分,有三種
下面開始繼續簡化
Multiple Systems? | Single System? | Single Objects? | |
---|---|---|---|
Information Flow? | Mediator | Command | Observer |
Structure | Adapter | Composite | Memento |
注意:information flow 和 structure是相對的。
再簡化
Pattern | |
---|---|
Information Flow? | Mediator |
Structure | Adapter |
最終簡化
information flow和structure實際上是一種概念的不一樣表達形式,例如list,能夠傳遞信息做爲input,output,也能夠做爲一種數據結構。因此歸爲一種
Pattern | |
---|---|
Information Flow? | Mediator |
核心:
全部的Design Pattern的職責都是控制information flow。
然而故事到這裏並無完。
下面關於information flow還有logic(變量)和message(即input和output,能夠是string,array,object等等)的區別
Logic | Hybrid | Message | |
---|---|---|---|
Purpose | Behavior | General Code | State |
State | Stateless | Stateful | Stateful |
Paradigm | Functional | OOP? | Data |
信息流的傳遞方式能夠概括爲三種:Ask(相似get方法), Tell(相似set方法), Translate(input=>output).
$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:
按Object角色role來分,一共5種:Representer, Doer, Dispatcher, Translator, Maker
phpclass User { public function getName(); //ask public function isAdmin(); public function setName($name); //tell }
phpclass EmailSystem { /** * @return boolean */ public function send(Message $msg); //tell }
phpclass Controller { /** * @return Response */ public function handle(Request $req); //translate }
phpclass UserView { /** * @return string HTML */ public function render(User $user);//translate }
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 |
做者的開發經驗得出有95%~99%的應用能夠用以上模式表達。
文章還會繼續修改,有興趣的同窗能夠直接觀看YouTube上的視頻,我在reference裏面給出了連接,還有做者的blog,可是blog中只有前半部份內容。
我我的對於design pattern的理解也頗有限,但願各位大神賜教。另外關於一些單詞的具體含義,我只能意會不能言傳。。。若是有大神願意仔細解讀的話,能夠留言。
同步更新在個人gitbook筆記中。