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插入任何系统。

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
把一个复杂的系统转换成一个简单的接口。

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相似合并,有以下表格

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

phpclass User {public function getName(); //askpublic 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

作者的开发经验得出有95%~99%的应用可以用以上模式表达。

文章还会继续修改,有兴趣的同学可以直接观看YouTube上的视频,我在reference里面给出了链接,还有作者的blog,但是blog中只有前半部分内容。
我个人对于design pattern的理解也很有限,希望各位大神赐教。另外关于一些单词的具体含义,我只能意会不能言传。。。如果有大神愿意仔细解读的话,可以留言。
同步更新在我的gitbook笔记中。

Reference

  1. Beyond Design Pattern 视频
  2. 视频作者blog

Design Pattern的万剑归宗 = Mediator相关推荐

  1. Design Pattern - Mediator(C#)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...

  2. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  3. Design Pattern Quick Overview

    Do we really need this design pattern? Just ignore, all the big guys requires it. For you, just unde ...

  4. 设计模式(Design Pattern)

    简介 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...

  5. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  6. 设计模式(Design Pattern)详细整理(含思维导图)

    设计模式(Design Pattern) 设计模式(Design pattern)代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一 ...

  7. 源于Design Pattern Explanation with C++ Implementation的 设计模式 C++

    1.创建型模式 (Creational Pattern) 1.1 工厂模式(Factory Pattern ) 1.2  抽象工厂模式(Abstract Factory Pattern ) 1.3   ...

  8. (原創) 我的Design Pattern之旅[3]:使用template改進Strategy Pattern (OO) (Design Pattern) (C/C++) (template)...

    在strategy pattern中,為了讓各strategy能方便存取原來物件的所有public member function,我們常用*this將整個物件傳給各strategy,這樣的設計並沒有 ...

  9. 5 Best User Interface Design Pattern Libraries

    为什么80%的码农都做不了架构师?>>>    Elements of Design Pattern Tap Patternry UI Patterns http://uxmovem ...

最新文章

  1. SAP MM 采购信息记录里的Automatic Sourcing
  2. docker Cannot start container [8] System error: exec format error
  3. pyharm虚拟环境_手把手教你如何在Pycharm中加载和使用虚拟环境
  4. 应用机器学习进行无人机航拍影像质量评估
  5. ES6-note-Set和Map(草稿)
  6. 不变性真的意味着线程安全吗?
  7. centos6配置mysql5.7_CentOS 6/7 下 MySQL 5.7 安装部署与配置
  8. 红米性价比之王宣布!网友:干翻友商小米、干翻友商荣耀
  9. netty : Max frame length of 65536 has been exceeded.
  10. jpages中文api
  11. python数据分析课程哪个好-数据分析课程里面,python是重点!
  12. 1.1、推断和设置“是否为 Web 环境”
  13. 百度成为“数字中国”建设核心推动力
  14. 微信群 保存到通讯录
  15. 使用C++模板判断是否基本类型
  16. 计算机网络管理员教材劳动部,劳动部教材办公室
  17. 【实用】MD5加密工具类及加密过程详解
  18. linux下查看硬盘型号、大小等信息(含Raid)
  19. LeeCode1468. 计算税后工资
  20. 【数据】【自动化交易】Python获取中国股市行情和指数

热门文章

  1. 嵌入式大杂烩 | 分享几个非常实用的开源项目
  2. 前端HTMl摩天轮展示
  3. Neo4j数据导入null property value
  4. Catia 弹簧设计
  5. java毕业设计游戏商城平台Mybatis+系统+数据库+调试部署
  6. Java增强for循环foreach
  7. SqlSugar安装使用和插入、更新、删除等基本操作
  8. win7计算机没有C盘,win7新电脑c盘如何分区_win7系统只有一个C盘怎么分区-win7之家...
  9. docker pull 详解
  10. 0基础该怎么学习软件测试?