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
相關文章
相關標籤/搜索