1. 程式人生 > >PHP設計模式之中介者模式(Mediator Pattern)瞭解下

PHP設計模式之中介者模式(Mediator Pattern)瞭解下

咱們先來看下中介者模式(Mediator Pattern)的定義,它就是,用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動,這種模式又稱為調停者模式,它是一種物件行為型模式。

我們先來看使用者與使用者直接聊天的設計方案。

在這個方案設計的過程中,我們可以發揮想象,使用者物件之間存在很強的關聯性,將導致系統出現如下問題:

  1. 系統結構複雜:物件之間存在大量的相互關聯和呼叫,若有一個物件發生變化,則需要跟蹤和該物件關聯的其他所有物件,並進行適當處理
  2. 物件可重用性差:由於一個物件和其他物件具有很強的關聯,若沒有其他物件的支援,一個物件很難被另一個系統或模組重用,這些物件表現出來更像一個不可分割的整體,職責較為混亂
  3. 系統擴充套件性低:增加一個新的物件需要在原有相關物件上增加引用,增加新的引用關係也需要調整原有物件,系統耦合度很高,物件操作很不靈活,擴充套件性差 

然而,在面向物件的軟體設計與開發過程中,根據“單一職責原則”,我們應該儘量將物件細化,使其只負責或呈現單一的職責,但是,對於一個模組來說,可能由很多物件構成,而且這些物件之間可能存在相互的引用,為了減少物件兩兩之間複雜的引用關係,使之成為一個鬆耦合的系統,我們需要使用中介者模式,這就是我們使用中介者模式的動機。

來看下中介者模式包含的角色:

  Mediator: 抽象中介者,在裡面定義了各個同事之間相互互動所需要的方法。
  ConcreteMediator: 具體中介者,它需要了解併為維護每個同事物件,並負責具體的協調各個同事物件的互動關係。
  Colleague:抽象同事類,通常實現成為抽象類,主要負責約束同事物件的型別,並實現一些具體同事類之間的公共功能
  ConcreteColleague:具體同事類,實現自己的業務,需要與其他同事物件互動,就通知中介物件,中介物件會負責後續的互動

再來看下圖片感受下:

來看一個完整的例項:

  1. 我們有一個CD類和一個MP3類,兩個類的結構相似。
  2. 我們需要在CD類更新的時候,同步更新MP3類。
  3. 傳統的做法就是在CD類中例項化MP3類,然後去更新,但是這麼做的話,程式碼就會很難維護,如果新增一個同樣的MP4類,那麼就沒法處理了。
  4. 中介者模式很好的處理了這種情況,通過中介者類,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 正常 觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變