Design Pattern的万剑归宗 = Mediator
Overview
今天看了YouTube上的一个讲Design Pattern的视频,把这个视频的大意给大家分享一下,该视频的作者是Anthony Ferrara。
大意就是作者把22种Design Pattern不断的重组归纳抽象直道最后抽象为一种设计模式,Mediator。
而所有的Design Pattern关注的核心问题就是如何控制信息流(但是我个人认为核心是如何解耦)。再根据信息流划分出对象在系统中担任的5种角色,Representer, Doer, Dispatcher, Translator, Maker。
大概就是以上的内容,但是具体如何实践还不太清楚。。。
演变过程
Re-grouped
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种设计模式分为了Creational, structural和Behavioral三大类。
而作者把设计模式按照Shim, Compsitional, Decompsitional分类
- Shim Patterns: 编程语言不能处理当前情况
例子:iterator模式,没有其他的方法能够更方便的遍历对象的时候,就会使用iterator模式。 - Compositional Patterns:要把一系列的object组合在一起
- Decompositional Patterns: 要把一个object拆分成多个object
要注意的是有些模式在多个分类里, 比如Mediator既可以用于组合模式又可以用于拆分模式。
由于现有的26种模式,有些模式彼此之间很难分辨区别。
如: Adapter, Facade, Bridge, Decorator, Proxy
如图所示,UML结构相同。
代码例子:
Adapter
要把已有的系统watchdog插入系统PSRLogger中,在log函数中,旧的接口(watchdog)被转换成了新的接口(log)。
用这个方法可以把watchdog插入任何系统。
php
use 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
把一个复杂的系统转换成一个简单的接口。
php
class 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相似合并,有以下表格
De-duplicated Grouping
Creational | Structural | Behavioral | |
---|---|---|---|
Compositional |
Adapter Composite |
Mediator Observer |
|
Decompositonal |
Adapter Composite |
Observer |
这里除去重复的只有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 (多系统间)
- Controlling Information Flow Within An Individual System (单系统)
- Controlling Information Flow Between Individual Objects (object之间)
De-Duplicated Re-Groupings
下面开始继续简化
Multiple Systems? | Single System? | Single Objects? | |
---|---|---|---|
Information Flow? | Mediator | Command | Observer |
Structure | Adapter | Composite | Memento |
注意:information flow 和 structure是相对的。
再简化
DeDe-Duplicated Re-Groupings
Pattern | |
---|---|
Information Flow? | Mediator |
Structure | Adapter |
最终简化
DeDe-Duplicated ReRe-Groupings
information flow和structure其实是一种概念的不同表达形式,例如list,可以传递信息作为input,output,也可以作为一种数据结构。所以归为一种
Pattern | |
---|---|
Information Flow? | Mediator |
核心:
所有的Design Pattern的职责都是控制information flow。
然而故事到这里并没有完。
下面关于information flow还有logic(变量)和message(即input和output,可以是string,array,object等等)的区别
Information Flow
Logic | Hybrid | Message | |
---|---|---|---|
Purpose | Behavior | General Code | State |
State | Stateless | Stateful | Stateful |
Paradigm | Functional | OOP? | Data |
Information Flow传递方式
信息流的传递方式可以归纳为三种:Ask(类似get方法), Tell(类似set方法), Translate(input=>output).
Ask
$msg = $obj->something();
Logic | Hybrid | Message |
---|---|---|
No | Yes | Yes |
Tell
$obj->something($msg);
Logic | Hybrid | Message |
---|---|---|
No | Yes | Yes |
Translate
$msg2 = $obj->do($msg1);
Logic | Hybrid | Message |
---|---|---|
Yes | Yes | No |
Note:
- ask总是有状态
- tell总是有状态
- translate可以是有状态也可以是无状态的
Object Role Patterns
按Object角色role来分,一共5种:Representer, Doer, Dispatcher, Translator, Maker
Representer
php
class User {public function getName(); //askpublic function isAdmin();public function setName($name); //tell }
Doer
php
class EmailSystem {/*** @return boolean*/public function send(Message $msg); //tell }
Dispatcher
php
class Controller {/*** @return Response*/public function handle(Request $req); //translate }
Translator
php
class UserView {/*** @return string HTML*/public function render(User $user);//translate }
Maker
php
class 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笔记中。
Reference
- Beyond Design Pattern 视频
- 视频作者blog
Design Pattern的万剑归宗 = Mediator相关推荐
- Design Pattern - Mediator(C#)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- Design Pattern Quick Overview
Do we really need this design pattern? Just ignore, all the big guys requires it. For you, just unde ...
- 设计模式(Design Pattern)
简介 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...
- [转]Design Pattern Interview Questions - Part 2
Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...
- 设计模式(Design Pattern)详细整理(含思维导图)
设计模式(Design Pattern) 设计模式(Design pattern)代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一 ...
- 源于Design Pattern Explanation with C++ Implementation的 设计模式 C++
1.创建型模式 (Creational Pattern) 1.1 工厂模式(Factory Pattern ) 1.2 抽象工厂模式(Abstract Factory Pattern ) 1.3 ...
- (原創) 我的Design Pattern之旅[3]:使用template改進Strategy Pattern (OO) (Design Pattern) (C/C++) (template)...
在strategy pattern中,為了讓各strategy能方便存取原來物件的所有public member function,我們常用*this將整個物件傳給各strategy,這樣的設計並沒有 ...
- 5 Best User Interface Design Pattern Libraries
为什么80%的码农都做不了架构师?>>> Elements of Design Pattern Tap Patternry UI Patterns http://uxmovem ...
最新文章
- SAP MM 采购信息记录里的Automatic Sourcing
- docker Cannot start container [8] System error: exec format error
- pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境
- 应用机器学习进行无人机航拍影像质量评估
- ES6-note-Set和Map(草稿)
- 不变性真的意味着线程安全吗?
- centos6配置mysql5.7_CentOS 6/7 下 MySQL 5.7 安装部署与配置
- 红米性价比之王宣布!网友:干翻友商小米、干翻友商荣耀
- netty : Max frame length of 65536 has been exceeded.
- jpages中文api
- python数据分析课程哪个好-数据分析课程里面,python是重点!
- 1.1、推断和设置“是否为 Web 环境”
- 百度成为“数字中国”建设核心推动力
- 微信群 保存到通讯录
- 使用C++模板判断是否基本类型
- 计算机网络管理员教材劳动部,劳动部教材办公室
- 【实用】MD5加密工具类及加密过程详解
- linux下查看硬盘型号、大小等信息(含Raid)
- LeeCode1468. 计算税后工资
- 【数据】【自动化交易】Python获取中国股市行情和指数