本文實例講述了PHP設計模式之中介者模式(Mediator Pattern)。分享給大家供大家參考,具體如下:
咱們先來看下中介者模式(Mediator Pattern)的定義,它就是,用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互,這種模式又稱為調停者模式,它是一種對象行為型模式。
我們先來看用戶與用戶直接聊天的設計方案。
在這個方案設計的過程中,我們可以發(fā)揮想象,用戶對象之間存在很強的關聯性,將導致系統(tǒng)出現如下問題:
- 系統(tǒng)結構復雜:對象之間存在大量的相互關聯和調用,若有一個對象發(fā)生變化,則需要跟蹤和該對象關聯的其他所有對象,并進行適當處理
- 對象可重用性差:由于一個對象和其他對象具有很強的關聯,若沒有其他對象的支持,一個對象很難被另一個系統(tǒng)或模塊重用,這些對象表現出來更像一個不可分割的整體,職責較為混亂
- 系統(tǒng)擴展性低:增加一個新的對象需要在原有相關對象上增加引用,增加新的引用關系也需要調整原有對象,系統(tǒng)耦合度很高,對象操作很不靈活,擴展性差
然而,在面向對象的軟件設計與開發(fā)過程中,根據“單一職責原則”,我們應該盡量將對象細化,使其只負責或呈現單一的職責,但是,對于一個模塊來說,可能由很多對象構成,而且這些對象之間可能存在相互的引用,為了減少對象兩兩之間復雜的引用關系,使之成為一個松耦合的系統(tǒng),我們需要使用中介者模式,這就是我們使用中介者模式的動機。
來看下中介者模式包含的角色:
- Mediator: 抽象中介者,在里面定義了各個同事之間相互交互所需要的方法。
- ConcreteMediator: 具體中介者,它需要了解并為維護每個同事對象,并負責具體的協調各個同事對象的交互關系。
- Colleague:抽象同事類,通常實現成為抽象類,主要負責約束同事對象的類型,并實現一些具體同事類之間的公共功能
- ConcreteColleague:具體同事類,實現自己的業(yè)務,需要與其他同事對象交互,就通知中介對象,中介對象會負責后續(xù)的交互
再來看下圖片感受下:
![](http://img.jbzj.com/file_images/article/201912/2019129103810671.png?2019119103916)
來看一個完整的實例:
- 我們有一個CD類和一個MP3類,兩個類的結構相似。
- 我們需要在CD類更新的時候,同步更新MP3類。
- 傳統(tǒng)的做法就是在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");
運行結果:
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;$icount($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相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- php設計模式 Mediator (中介者模式)
- php設計模式之建造器模式分析【星際爭霸游戲案例】
- php設計模式之抽象工廠模式分析【星際爭霸游戲案例】
- php設計模式之工廠方法模式分析【星際爭霸游戲案例】
- PHP設計模式之外觀模式(Facade)入門與應用詳解
- PHP設計模式之觀察者模式(Observer)詳細介紹和代碼實例
- php設計模式 Template (模板模式)
- php設計模式 DAO(數據訪問對象模式)
- PHP常用的三種設計模式匯總
- php單態(tài)設計模式(單例模式)實例
- php設計模式 Interpreter(解釋器模式)
- php設計模式之中介者模式分析【星際爭霸游戲案例】