中介者模式: 中介者模式(Mediator Pattern)定義:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調停者模式,它是一種對象行為型模式。 模式動機: 1.在用戶與用戶直接聊天的設計方案中,用戶 ...
中介者模式:
中介者模式(Mediator Pattern)定義:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調停者模式,它是一種對象行為型模式。
模式動機:
1.在用戶與用戶直接聊天的設計方案中,用戶對象之間存在很強的關聯性,將導致系統出現如下問題:
系統結構複雜:對象之間存在大量的相互關聯和調用,若有一個對象發生變化,則需要跟蹤和該對象關聯的其他所有對象,併進行適當處理。
2.對象可重用性差:由於一個對象和其他對象具有很強的關聯,若沒有其他對象的支持,一個對象很難被另一個系統或模塊重用,這些對象表現出來更像一個不可分割的整體,職責較為混亂。
3.系統擴展性低:增加一個新的對象需要在原有相關對象上增加引用,增加新的引用關係也需要調整原有對象,系統耦合度很高,對象操作很不靈活,擴展性差。
4.在面向對象的軟體設計與開發過程中,根據“單一職責原則”,我們應該儘量將對象細化,使其只負責或呈現單一的職責。
5.對於一個模塊,可能由很多對象構成,而且這些對象之間可能存在相互的引用,為了減少對象兩兩之間複雜的引用關係,使之成為一個松耦合的系統,我們需要使用中介者模式,這就是中介者模式的模式動機。
中介者模式包含如下角色:
Mediator: 抽象中介者,在裡面定義了各個同事之間相互交互所需要的方法。
ConcreteMediator: 具體中介者,它需要瞭解併為維護每個同事對象,並負責具體的協調各個同事對象的交互關係。
Colleague:抽象同事類,通常實現成為抽象類,主要負責約束同事對象的類型,並實現一些具體同事類之間的公共功能
ConcreteColleague:具體同事類,實現自己的業務,需要與其他同事對象交互,就通知中介對象,中介對象會負責後續的交互
UML類圖:
//代碼實現:
header("Content-type:text/html;Charset=utf-8"); //抽象同事類,家教 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 ),將為其匹配合適的學生