资讯专栏INFORMATION COLUMN

Design Pattern的万剑归宗 => Mediator

yuanzhanghu / 2919人阅读

摘要:大意就是作者把种不断的重组归纳抽象直道最后抽象为一种设计模式,。而所有的关注的核心问题就是如何控制信息流但是我个人认为核心是如何解耦。再根据信息流划分出对象在系统中担任的种角色,。所以归为一种核心所有的的职责都是控制。

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

Beyond Design Pattern 视频

视频作者blog

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21004.html

相关文章

  • gulp和webpack初探

    摘要:首先声明一下,和两者关系不大,主要是团队之前一直用构建工具,这几天业务上比较清闲,老大让我学学新的和这些潮流工具,于是草草研究了一天,记一些笔记。最后使用将各个组件打包在一起。 首先声明一下,gulp和webpack两者关系不大,主要是团队之前一直用grunt构建工具,这几天业务上比较清闲,老大让我学学新的gulp和webpack这些潮流工具,于是草草研究了一天,记一些笔记。 gulp...

    jhhfft 评论0 收藏0
  • 一起学设计模式 - 中介者模式

    摘要:在地球上最大的中介者就是联合国了,它主要用来维护国际和平与安全解决国际间经济社会文化和人道主义性质的问题。所以对于关系比较复杂的系统,我们为了减少对象之间的关联关系,使之成为一个松耦合系统,我们就需要使用中介者模式。 中介者模式(Mediator Pattern)属于行为型模式的一种,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独...

    denson 评论0 收藏0
  • 常用设计模式

    摘要:工厂设计模式工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用关键字实例化对象,通过反射,根据类名称动态创建对象示例静态工厂模式构造方法私有化获取指定类名称的对象动态代理模式动态代理模式,主要用于对同一接口子类的相同逻辑进行代理操作 工厂设计模式 工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用new关键字实例化对象,通过反射,根据类名称动态创建对象 示例: pa...

    fizz 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • 设计模式

    摘要:设计模式目的为了代码可重用性让代码更容易被他人理解保证代码可靠性设计原则设计原则是设计模式为了达到其目的,所实现的一些准则。 设计模式简介 1.什么是设计模式 设计模式对是经验的总结,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。代表了最佳的实战。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...

    enrecul101 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<