PHP設計模式之中介者模式(Mediator Pattern)瞭解下
咱們先來看下中介者模式(Mediator Pattern)的定義,它就是,用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動,這種模式又稱為調停者模式,它是一種物件行為型模式。
我們先來看使用者與使用者直接聊天的設計方案。
在這個方案設計的過程中,我們可以發揮想象,使用者物件之間存在很強的關聯性,將導致系統出現如下問題:
- 系統結構複雜:物件之間存在大量的相互關聯和呼叫,若有一個物件發生變化,則需要跟蹤和該物件關聯的其他所有物件,並進行適當處理
- 物件可重用性差:由於一個物件和其他物件具有很強的關聯,若沒有其他物件的支援,一個物件很難被另一個系統或模組重用,這些物件表現出來更像一個不可分割的整體,職責較為混亂
- 系統擴充套件性低:增加一個新的物件需要在原有相關物件上增加引用,增加新的引用關係也需要調整原有物件,系統耦合度很高,物件操作很不靈活,擴充套件性差
然而,在面向物件的軟體設計與開發過程中,根據“單一職責原則”,我們應該儘量將物件細化,使其只負責或呈現單一的職責,但是,對於一個模組來說,可能由很多物件構成,而且這些物件之間可能存在相互的引用,為了減少物件兩兩之間複雜的引用關係,使之成為一個鬆耦合的系統,我們需要使用中介者模式,這就是我們使用中介者模式的動機。
來看下中介者模式包含的角色:
Mediator: 抽象中介者,在裡面定義了各個同事之間相互互動所需要的方法。
ConcreteMediator: 具體中介者,它需要了解併為維護每個同事物件,並負責具體的協調各個同事物件的互動關係。
Colleague:抽象同事類,通常實現成為抽象類,主要負責約束同事物件的型別,並實現一些具體同事類之間的公共功能
ConcreteColleague:具體同事類,實現自己的業務,需要與其他同事物件互動,就通知中介物件,中介物件會負責後續的互動
再來看下圖片感受下:
來看一個完整的例項:
- 我們有一個CD類和一個MP3類,兩個類的結構相似。
- 我們需要在CD類更新的時候,同步更新MP3類。
- 傳統的做法就是在CD類中例項化MP3類,然後去更新,但是這麼做的話,程式碼就會很難維護,如果新增一個同樣的MP4類,那麼就沒法處理了。
- 中介者模式很好的處理了這種情況,通過中介者類,CD類中只要呼叫中介者這個類,就能同步更新這些資料。
程式碼例項如下:
<?php class CD { public $band = ''; public $title = ''; protected $_mediator; public function __construct(MusicContainerMediator $mediator = NULL) { $this->_mediator = $mediator; } public function save() { //具體實現待定 var_dump($this); } public function changeBandName($bandname) { if ( ! is_null($this->_mediator)) { $this->_mediator->change($this, array("band" => $bandname)); } $this->band = $bandname; $this->save(); } } //MP3Archive類 class MP3Archive { protected $_mediator; public function __construct(MusicContainerMediator $mediator = NULL) { $this->_mediator = $mediator; } public function save() { //具體實現待定 var_dump($this); } public function changeBandName($bandname) { if ( ! is_null($this->_mediator)) { $this->_mediator->change($this, array("band" => $bandname)); } $this->band = $bandname; $this->save(); } } //中介者類 class MusicContainerMediator { protected $_containers = array(); public function __construct() { $this->_containers[] = "CD"; $this->_containers[] = "MP3Archive"; } public function change($originalObject, $newValue) { $title = $originalObject->title; $band = $originalObject->band; foreach ($this->_containers as $container) { if ( ! ($originalObject instanceof $container)) { $object = new $container; $object->title = $title; $object->band = $band; foreach ($newValue as $key => $val) { $object->$key = $val; } $object->save(); } } } } //測試例項 $titleFromDB = "Waste of a Rib"; $bandFromDB = "Never Again"; $mediator = new MusicContainerMediator(); $cd = new CD($mediator); $cd->title = $titleFromDB; $cd->band = $bandFromDB; $cd->changeBandName("Maybe Once More");
還有個例項,一起看下吧:
//抽象同事類,家教
abstract class Tutor{
protected $message; //個人資訊
protected $mediator; //為家教服務的中介機構
function __construct($message,Mediator $mediator){
$this->message = $message;
$this->mediator = $mediator;
}
//獲取個人資訊
function getMessage(){
return $this->message;
}
//找學生
abstract function findStudent();
}
//具體同事類,大學生家教
class UndergraduateTutor extends Tutor{
//家教型別
public $type = "UndergraduateTutor";
function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找學生,讓中介機構代為尋找
function findStudent(){
$this->mediator->matchStudent($this);
}
}
//具體同事類,高中生家教
class SeniorStudentTutor extends Tutor{
//家教型別
public $type = "SeniorStudentTutor";
function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找學生,讓中介機構代為尋找
function findStudent(){
$this->mediator->matchStudent($this);
}
}
//具體同事類,初中生家教
class MiddleStudentTutor extends Tutor{
//家教型別
public $type = "MiddleStudentTutor";
function __construct($message,Mediator $mediator){
parent::__construct($message,$mediator);
}
//找學生,讓中介機構代為尋找
function findStudent(){
$this->mediator->matchStudent($this);
}
}
//抽象中介類
abstract class AbstractMediator{
abstract function matchStudent(Tutor $tutor);
}
//具體中介類,為家教匹配合適的學生
class Mediator extends AbstractMediator{
//定義其服務的所有家教,不在範圍內的不服務
private $serveObject = array("UndergraduateTutor","SeniorStudentTutor","MiddleStudentTutor");
//匹配學生
function matchStudent(Tutor $tutor){
for($i=0;$i<count($this->serveObject);$i++){
if($tutor->type == $this->serveObject[$i]){
$message = $tutor->getMessage();
echo "該家教個人資訊為".print_r($message)."<br/>將為其匹配合適的學生";
break;
}
}
if($i>=count($this->serveObject)){
echo "該家教不在我中介機構服務範圍內";
}
}
}
//測試
$mediator = new Mediator();
$undergraduateTutor = new UndergraduateTutor(array("name"=>"張三","age"=>22),$mediator);
$undergraduateTutor->findStudent();
//結果:該家教個人資訊為 Array ( [name] => 張三 [age] => 22 ),將為其匹配合適的學生
好啦,本次記錄就到這裡了。
如果感覺不錯的話,請多多點贊支援哦。。。
相關推薦
PHP設計模式之中介者模式(Mediator Pattern)瞭解下
咱們先來看下中介者模式(Mediator Pattern)的定義,它就是,用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動,這種模式又稱為調停者模式,它是一種物件行為型模式。 我們先來看使用者與使用
設計模式之中介者模式 Mediator
mar class art logs super ace gis and log 代碼實現 public interface Mediator { void register(String dname,Department d); void co
設計模式---接口隔離模式之中介者模式(Mediator)
單向 com clas 分享 分享圖片 獨立 mage 分解 pan 一:概念 在Mediator模式中,類之間的交互行為被統一放在Mediator的對象中,對象通過Mediator對象同其他對象交互。Mediator對象起到控制器的作用 二:動機 在軟件
設計模式之中介者模式(Mediator Pattern)
中介者模式定義 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referrin
設計模式之---中介者模式(Mediator Design Pattern)
場景 買房租房找中介,男女相親找中介。 用一箇中介物件來封裝一系列的物件互動。 中介者使各物件不需要顯式地相互引用,從而使其韌合鬆散,而且可以獨立地改變它們之間的互動。 簡單點來說,將原來兩個直
設計模式之中介者模式
中介者對象1、中介者模式的簡介: a、中介者模式的核心: - 如果一個系統中對象之間的聯系是呈現為網狀結構,對象之間存在大量多對多關系,將導致關系極其復雜,這些對象稱為“同事對象”。 - 我們可以引入一個中介者對象,使各個同事對象只跟中介者對象打交道,將復雜的網絡結構解為如下的星
javaScript 設計模式之中介者模式示例
ava 設計模式 cti rip type color function div this 飛機把註冊信息放到鐵塔裏,發送數據到鐵塔,報告其它的飛機一些信息。 var feiji = function( name ){ this.name = name; }
Head First設計模式之中介者模式
函數 padding sta sin color 系列文章 自己的 技術 接口 一、定義 又稱為調停者模式,定義一個中介對象來封裝系列對象之間的交互。中介者使各個對象不需要顯示地相互引用,從而使其耦合性松散,而且可以獨立地改變他們之間的交互。 二、結構 組成:
大話設計模式之中介者模式
brush 行為 imp script 依賴關系 sig 交互 轉化 核武器 中介者模式 用一個中介對象來封裝一系列對象的交互。中介者使各個對象不需要顯示的相互引用,從而使其耦合松散,而且可以獨立的改變他們之間的交互。 涉及到的角色描述 - Mediator:抽象
設計模式的藝術 行為型模式之中介者模式
前言 微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低 什麼是中介者模式 Mediator P
設計模式的藝術 行為型模式之中介者模式
前言 微信有一個群聊功能,群聊中的資訊你不需要加別人為好友就可以接收的到資訊,因為群的機制,極大的減少了使用者之間的兩兩通訊,在軟體設計中,也有類似於微信使用者之間的關係,我們也可以借鑑微信群的模式,來降低物件與物件之間的互動,使得系統的耦合度大大降低 什麼是中介者模式
設計模式之中介者模式(C++)
設計模式之中介者模式 中介者模式,用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地互相引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。該模式很好理解,其UML圖如下: Med
23種設計模式之中介者模式
中介者模式的定義 中介者模式, 當多個類彼此關聯, 會增大耦合性, 這時各個模組通過中介者進行交流, 每個模組只負責自己的業務邏輯, 不屬於自己的就丟給中介者, 降低耦合 定義: 用一箇中介物件封裝一系列的物件互動, 中介者使各物件不需要顯示的相互作用,從而使其耦合鬆散,而且可以獨立的改變他們之間的互動.
android設計模式之中介者模式
中介者模式包裝了一系列物件相互作用的方式,使得物件不必相互明顯作用。使它們可以鬆散耦合。當某些物件之間的作用發生改變時,不會立即影響其他的一些物件之間的作用。保證這些作用可以彼此獨立變化。中介者模式將多對多的相互作用轉化為一對多的相互作用。中介者模式將物件的行為和協作抽象化,把物件在小尺度的行為上與
大話設計模式之中介者模式總結-java實現
注:示例來自《大話設計模式》 儘管將一個系統分割成許多物件通常可以增加其可複用性 但是物件間相互連線的激增又會降低其可複用性 因為大量的連線使得一個物件不可能在沒有其他物件的支援下工作 系統表現為一個不可分割的整體 所以 對系統的行為進行任何較大的改動就十分困
深入理解JavaScript系列(36):設計模式之中介者模式
介紹 中介者模式(Mediator),用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。 主要內容來自:http://www.addyosmani.com/resources/essentia
折騰Java設計模式之中介者模式
ani 不同類 cte 要去 裏的 hashmap ESS 一個 java設計模式 博文原址:折騰Java設計模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之
設計模式系列之中介者模式(Mediator Pattern)——協調多個物件之間的互動
說明:設計模式系列文章是讀`劉偉`所著`《設計模式的藝術之道(軟體開發人員內功修煉之道)》`一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部落格`https://blog.csdn.net/LoveLion/article/details/17517213` ## 模
GoF之中介者模式(Mediator)
耦合度 自己 sed ets 引用 def 獨立性 rip clas 定義 定義一個接口用來封裝一群對象的互動行為,中介者通過移除對象之間的引用,來減少他們之間的耦合,並且能改變他們之間的互動獨立性。 整合系統功能,減少系統內部的耦合度。與Facade
PHP 設計模式之觀察者模式
通知 更新 一對多 改變 變化 variable 它的 all 正常 觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變