Design Pattern的万剑归宗 => Mediator

Overview

今天看了YouTube上的一个讲Design Pattern的视频,把这个视频的大意给你们分享一下,该视频的做者是Anthony Ferrara。
大意就是做者把22种Design Pattern不断的重组概括抽象直道最后抽象为一种设计模式,Mediator。
而全部的Design Pattern关注的核心问题就是如何控制信息流(可是我我的认为核心是如何解耦)。再根据信息流划分出对象在系统中担任的5种角色,Representer, Doer, Dispatcher, Translator, Maker。php

大概就是以上的内容,可是具体如何实践还不太清楚。。。html


演变过程

Re-grouped

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分类
编程

  • 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插入任何系统。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类似合并,有如下表格函数

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(); //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

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

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

Reference

  1. Beyond Design Pattern 视频
  2. 视频做者blog
相关文章
相关标签/搜索