主頁 > 知識(shí)庫 > PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解

PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解

熱門標(biāo)簽:山西回?fù)芡夂粝到y(tǒng) 青島語音外呼系統(tǒng)招商 昭通辦理400電話 騰訊外呼管理系統(tǒng) 岳陽外呼型呼叫中心系統(tǒng)在哪里 百應(yīng)電話機(jī)器人服務(wù) 河南電銷卡外呼系統(tǒng)哪家強(qiáng) 山西探意電話機(jī)器人 揚(yáng)州地圖標(biāo)注app

本文實(shí)例講述了PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)。分享給大家供大家參考,具體如下:

咱們先來看下中介者模式(Mediator Pattern)的定義,它就是,用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互,這種模式又稱為調(diào)停者模式,它是一種對(duì)象行為型模式。

我們先來看用戶與用戶直接聊天的設(shè)計(jì)方案。

在這個(gè)方案設(shè)計(jì)的過程中,我們可以發(fā)揮想象,用戶對(duì)象之間存在很強(qiáng)的關(guān)聯(lián)性,將導(dǎo)致系統(tǒng)出現(xiàn)如下問題:

  1. 系統(tǒng)結(jié)構(gòu)復(fù)雜:對(duì)象之間存在大量的相互關(guān)聯(lián)和調(diào)用,若有一個(gè)對(duì)象發(fā)生變化,則需要跟蹤和該對(duì)象關(guān)聯(lián)的其他所有對(duì)象,并進(jìn)行適當(dāng)處理
  2. 對(duì)象可重用性差:由于一個(gè)對(duì)象和其他對(duì)象具有很強(qiáng)的關(guān)聯(lián),若沒有其他對(duì)象的支持,一個(gè)對(duì)象很難被另一個(gè)系統(tǒng)或模塊重用,這些對(duì)象表現(xiàn)出來更像一個(gè)不可分割的整體,職責(zé)較為混亂
  3. 系統(tǒng)擴(kuò)展性低:增加一個(gè)新的對(duì)象需要在原有相關(guān)對(duì)象上增加引用,增加新的引用關(guān)系也需要調(diào)整原有對(duì)象,系統(tǒng)耦合度很高,對(duì)象操作很不靈活,擴(kuò)展性差 

然而,在面向?qū)ο蟮能浖O(shè)計(jì)與開發(fā)過程中,根據(jù)“單一職責(zé)原則”,我們應(yīng)該盡量將對(duì)象細(xì)化,使其只負(fù)責(zé)或呈現(xiàn)單一的職責(zé),但是,對(duì)于一個(gè)模塊來說,可能由很多對(duì)象構(gòu)成,而且這些對(duì)象之間可能存在相互的引用,為了減少對(duì)象兩兩之間復(fù)雜的引用關(guān)系,使之成為一個(gè)松耦合的系統(tǒng),我們需要使用中介者模式,這就是我們使用中介者模式的動(dòng)機(jī)。

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

  •   Mediator: 抽象中介者,在里面定義了各個(gè)同事之間相互交互所需要的方法。
  •   ConcreteMediator: 具體中介者,它需要了解并為維護(hù)每個(gè)同事對(duì)象,并負(fù)責(zé)具體的協(xié)調(diào)各個(gè)同事對(duì)象的交互關(guān)系。
  •   Colleague:抽象同事類,通常實(shí)現(xiàn)成為抽象類,主要負(fù)責(zé)約束同事對(duì)象的類型,并實(shí)現(xiàn)一些具體同事類之間的公共功能
  •   ConcreteColleague:具體同事類,實(shí)現(xiàn)自己的業(yè)務(wù),需要與其他同事對(duì)象交互,就通知中介對(duì)象,中介對(duì)象會(huì)負(fù)責(zé)后續(xù)的交互

再來看下圖片感受下:

來看一個(gè)完整的實(shí)例:

  1. 我們有一個(gè)CD類和一個(gè)MP3類,兩個(gè)類的結(jié)構(gòu)相似。
  2. 我們需要在CD類更新的時(shí)候,同步更新MP3類。
  3. 傳統(tǒng)的做法就是在CD類中實(shí)例化MP3類,然后去更新,但是這么做的話,代碼就會(huì)很難維護(hù),如果新增一個(gè)同樣的MP4類,那么就沒法處理了。
  4. 中介者模式很好的處理了這種情況,通過中介者類,CD類中只要調(diào)用中介者這個(gè)類,就能同步更新這些數(shù)據(jù)。

代碼實(shí)例如下:

?php
class CD {
 public $band = '';
 public $title = '';
 protected $_mediator;

 public function __construct(MusicContainerMediator $mediator = NULL) {
 $this->_mediator = $mediator;
 }

 public function save() {
 //具體實(shí)現(xiàn)待定
 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() {
 //具體實(shí)現(xiàn)待定
 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();
  }
 }
 }
}

//測(cè)試實(shí)例
$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");

運(yùn)行結(jié)果:

object(MP3Archive)#3 (3) {
  ["_mediator":protected]=>
  NULL
  ["title"]=>
  string(14) "Waste of a Rib"
  ["band"]=>
  string(15) "Maybe Once More"
}
object(CD)#2 (3) {
  ["band"]=>
  string(15) "Maybe Once More"
  ["title"]=>
  string(14) "Waste of a Rib"
  ["_mediator":protected]=>
  object(MusicContainerMediator)#1 (1) {
    ["_containers":protected]=>
    array(2) {
      [0]=>
      string(2) "CD"
      [1]=>
      string(10) "MP3Archive"
    }
  }
}

還有個(gè)實(shí)例,一起看下吧:

//抽象同事類,家教
abstract class Tutor{
  protected $message;  //個(gè)人信息
  protected $mediator; //為家教服務(wù)的中介機(jī)構(gòu)
  function __construct($message,Mediator $mediator){
    $this->message = $message;
    $this->mediator = $mediator;
  }
  //獲取個(gè)人信息
  function getMessage(){
    return $this->message;
  }
  //找學(xué)生
  abstract function findStudent();
}
//具體同事類,大學(xué)生家教
class UndergraduateTutor extends Tutor{
  //家教類型
  public $type = "UndergraduateTutor";

  function __construct($message,Mediator $mediator){
     parent::__construct($message,$mediator);
  }
  //找學(xué)生,讓中介機(jī)構(gòu)代為尋找
  function findStudent(){
     $this->mediator->matchStudent($this);
  }
}
//具體同事類,高中生家教
class SeniorStudentTutor extends Tutor{
  //家教類型
  public $type = "SeniorStudentTutor";

  function __construct($message,Mediator $mediator){
     parent::__construct($message,$mediator);
  }
  //找學(xué)生,讓中介機(jī)構(gòu)代為尋找
  function findStudent(){
     $this->mediator->matchStudent($this);
  }
}
//具體同事類,初中生家教
class MiddleStudentTutor extends Tutor{
  //家教類型
  public $type = "MiddleStudentTutor";

  function __construct($message,Mediator $mediator){
     parent::__construct($message,$mediator);
  }
  //找學(xué)生,讓中介機(jī)構(gòu)代為尋找
  function findStudent(){
     $this->mediator->matchStudent($this);
  }
}

//抽象中介類
abstract class AbstractMediator{
  abstract function matchStudent(Tutor $tutor);
}
//具體中介類,為家教匹配合適的學(xué)生
class Mediator extends AbstractMediator{
  //定義其服務(wù)的所有家教,不在范圍內(nèi)的不服務(wù)
  private $serveObject = array("UndergraduateTutor","SeniorStudentTutor","MiddleStudentTutor");
  //匹配學(xué)生
  function matchStudent(Tutor $tutor){
     for($i=0;$icount($this->serveObject);$i++){
       if($tutor->type == $this->serveObject[$i]){
         $message = $tutor->getMessage();
         echo "該家教個(gè)人信息為".print_r($message)."br/>將為其匹配合適的學(xué)生";
         break;
       }
     }
     if($i>=count($this->serveObject)){
       echo "該家教不在我中介機(jī)構(gòu)服務(wù)范圍內(nèi)";
     }
  }
}

//測(cè)試
$mediator = new Mediator();
$undergraduateTutor = new UndergraduateTutor(array("name"=>"張三","age"=>22),$mediator);
$undergraduateTutor->findStudent();
//結(jié)果:該家教個(gè)人信息為 Array ( [name] => 張三 [age] => 22 ),將為其匹配合適的學(xué)生

好啦,本次記錄就到這里了。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • php設(shè)計(jì)模式 Mediator (中介者模式)
  • php設(shè)計(jì)模式之建造器模式分析【星際爭(zhēng)霸游戲案例】
  • php設(shè)計(jì)模式之抽象工廠模式分析【星際爭(zhēng)霸游戲案例】
  • php設(shè)計(jì)模式之工廠方法模式分析【星際爭(zhēng)霸游戲案例】
  • PHP設(shè)計(jì)模式之外觀模式(Facade)入門與應(yīng)用詳解
  • PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
  • php設(shè)計(jì)模式 Template (模板模式)
  • php設(shè)計(jì)模式 DAO(數(shù)據(jù)訪問對(duì)象模式)
  • PHP常用的三種設(shè)計(jì)模式匯總
  • php單態(tài)設(shè)計(jì)模式(單例模式)實(shí)例
  • php設(shè)計(jì)模式 Interpreter(解釋器模式)
  • php設(shè)計(jì)模式之中介者模式分析【星際爭(zhēng)霸游戲案例】

標(biāo)簽:南陽 黃南 鎮(zhèn)江 湛江 銅川 婁底 寶雞 宜賓

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,之,中介,者,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門與應(yīng)用案例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章