中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中怎么實現中介者模式

發布時間:2021-06-12 18:31:32 來源:億速云 閱讀:188 作者:Leah 欄目:開發技術

本篇文章為大家展示了PHP中怎么實現中介者模式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

  1. 系統結構復雜:對象之間存在大量的相互關聯和調用,若有一個對象發生變化,則需要跟蹤和該對象關聯的其他所有對象,并進行適當處理

  2. 對象可重用性差:由于一個對象和其他對象具有很強的關聯,若沒有其他對象的支持,一個對象很難被另一個系統或模塊重用,這些對象表現出來更像一個不可分割的整體,職責較為混亂

  3. 系統擴展性低:增加一個新的對象需要在原有相關對象上增加引用,增加新的引用關系也需要調整原有對象,系統耦合度很高,對象操作很不靈活,擴展性差 

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

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

  •   Mediator: 抽象中介者,在里面定義了各個同事之間相互交互所需要的方法。

  •   ConcreteMediator: 具體中介者,它需要了解并為維護每個同事對象,并負責具體的協調各個同事對象的交互關系。

  •   Colleague:抽象同事類,通常實現成為抽象類,主要負責約束同事對象的類型,并實現一些具體同事類之間的公共功能

  •   ConcreteColleague:具體同事類,實現自己的業務,需要與其他同事對象交互,就通知中介對象,中介對象會負責后續的交互

再來看下圖片感受下:

PHP中怎么實現中介者模式

來看一個完整的實例:

  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");

運行結果:

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"
    }
  }
}

還有個實例,一起看下吧:

//抽象同事類,家教
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中怎么實現中介者模式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

南和县| 绩溪县| 连城县| 安庆市| 敖汉旗| 宁陕县| 宁津县| 姜堰市| 塔河县| 克拉玛依市| 什邡市| 西平县| 洞头县| 香港| 盐亭县| 新邵县| 南宫市| 德庆县| 荆州市| 平江县| 盐源县| 三穗县| 鄂伦春自治旗| 谢通门县| 双江| 乳山市| 新乡县| 社旗县| 滨州市| 资溪县| 阜阳市| 大连市| 石河子市| 广元市| 兴山县| 阿城市| 天柱县| 衡南县| 桃园县| 潮安县| 霍州市|