今天看了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笔记中。