<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## **模式的定義與特點** 中介者(Mediator)模式的定義:定義一個中介對象來封裝一系列對象之間的交互,使原有對象之間的耦合松散,且可以獨立地改變它們之間的交互。中介者模式又叫調停模式,它是迪米特法則的典型應用。 **優點** 1. 降低了對象之間的耦合性,使得對象易于獨立地被復用。 2. 將對象間的一對多關聯轉變為一對一的關聯,提高系統的靈活性,使得系統易于維護和擴展。 **缺點:** * 當同事類太多時,中介者的職責將很大,它會變得復雜而龐大,以至于系統難以維護。 ## **模式的結構與實現** 中介者模式實現的關鍵是找出“中介者”,下面對它的結構和實現進行分析 ## **模式的應用場景** * 當對象之間存在復雜的網狀結構關系而導致依賴關系混亂且難以復用時。 * 當想創建一個運行于多個類之間的對象,又不想生成新的子類時。 例如,你剛剛參力口工作想租房,可以找“房屋中介”;或者,自己剛剛到一個陌生城市找工作,可以找“人才交流中心”幫忙。在 MVC 框架中,控制器(C)就是模型(M)和視圖(V)的中介者;還有大家常用的 QQ 聊天程序的“中介者”是 QQ 服務器 ## **模式的結構** 1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對象注冊與轉發同事對象信息的抽象方法。 2. 具體中介者(ConcreteMediator)角色:實現中介者接口,定義一個 List 來管理同事對象,協調各個同事角色之間的交互關系,因此它依賴于同事角色。 3. 抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對象,提供同事對象交互的抽象方法,實現所有相互影響的同事類的公共功能。 4. 具體同事類(Concrete Colleague)角色:是抽象同事類的實現者,當需要與其他同事對象交互時,由中介者對象負責后續的交互。 中介者模式的結構圖如圖。 ![](https://img.kancloud.cn/1b/26/1b263d9f802c5b0f263a73022d724224_745x390.png) //將 具體同事類 以屬性的方式注冊到具體中介者類,在有中介者類轉發 ``` <?php //抽象中介者 abstract class Mediator { abstract public function register(Colleague $colleague); abstract public function relay(Colleague $cl); //轉發 } //具體中介者 class ConcreteMediator extends Mediator { private $colleagues = array(); public function register(Colleague $colleague) { if (!in_array($colleague, $this->colleagues, true)) { $this->colleagues[] = $colleague; $colleague->setMedium($this); } } public function relay(Colleague $cl) { foreach ($this->colleagues as $colleague) { if ($colleague === $cl) { $colleague->receive(); } } } } //抽象同事類 abstract class Colleague { protected $mediator; public function setMedium(Mediator $mediator) { $this->mediator = $mediator; } abstract public function receive(); abstract public function send(); } //具體同事類 class ConcreteColleague1 extends Colleague { public function receive() { print_r("具體同事類1收到請求。"); } public function send() { print_r("具體同事類1發出請求。"); $this->mediator->relay($this); //請中介者轉發 } } //具體同事類 class ConcreteColleague2 extends Colleague { public function receive() { print_r("具體同事類2收到請求。"); } public function send() { print_r("具體同事類2發出請求。"); $this->mediator->relay($this); //請中介者轉發 } } class MediatorPattern { public static function main() { //實例化具體中介者 $mediator = new ConcreteMediator(); //實例化具體具體同事類 $c1 = new ConcreteColleague1(); $c2 = new ConcreteColleague2(); //將具體同時類注冊到具體中介者中 $mediator->register($c1); $mediator->register($c2); $c1->send(); echo "<br>"; $c2->send(); } } MediatorPattern::main(); 結果: 具體同事類1發出請求。具體同事類1收到請求。 具體同事類2發出請求。具體同事類2收到請求。 ``` 例子2: ``` //抽象中介者 abstract class Mediator { // 中介者角色 abstract public function send($message, $colleague); } //具體中介者 class ConcreteMediator extends Mediator { // 具體中介者角色 private $_colleague1 = null; private $_colleague2 = null; public function send($message, $colleague) { if ($colleague == $this->_colleague1) { $this->_colleague1->notify($message); } else { $this->_colleague2->notify($message); } } public function set($colleague1, $colleague2) { $this->_colleague1 = $colleague1; $this->_colleague2 = $colleague2; } } abstract class Colleague { // 抽象對象 private $_mediator = null; public function __construct($mediator) { $this->_mediator = $mediator; } public function send($message) { $this->_mediator->send($message, $this); } abstract public function notify($message); } class Colleague1 extends Colleague { // 具體對象角色 public function notify($message) { output(sprintf('Colleague-1: %s', $message)); } } class Colleague2 extends Colleague { // 具體對象角色 public function notify($message) { output(sprintf('Colleague-2: %s', $message)); } } class Client { public static function test() { // client $objMediator = new ConcreteMediator(); $objC1 = new Colleague1($objMediator); $objC2 = new Colleague2($objMediator); $objMediator->set($objC1, $objC2); $objC1->send("to c2 from c1"); $objC2->send("to c1 from c2"); } } Client::test( ``` ## 模式的擴展 在實際開發中,通常采用以下兩種方法來簡化中介者模式,使開發變得更簡單。 1. 不定義中介者接口,把具體中介者對象實現成為單例。 2. 同事對象不持有中介者,而是在需要的時f矣直接獲取中介者對象并調用。 ![](https://img.kancloud.cn/39/ed/39ed430ac0d68bac0568a7de36a4dfef_784x415.png) ``` <?php //簡單單例中介者 class SimpleMediator { private static $simpleMediator; private $colleagues = array(); private function __construct() { } public static function getMedium() { if (self::$simpleMediator === null) { self::$simpleMediator = new self(); } return (self::$simpleMediator); } public function register(SimpleColleague $colleague) { if (!in_array($colleague, $this->colleagues, true)) { $this->colleagues[] = $colleague; } } public function relay(SimpleColleague $scl) { foreach ($this->colleagues as $colleague) { if ($colleague === $scl) { $colleague->receive(); } } } } //抽象同事類 interface SimpleColleague { public function receive(); function send(); } //具體同事類 class SimpleConcreteColleague1 implements SimpleColleague { public function __construct() { $simpleMediator = SimpleMediator::getMedium(); $simpleMediator->register($this); } public function receive() {print_r("具體同事類1:收到請求。");} public function send() { $simpleMediator = SimpleMediator::getMedium(); print_r("具體同事類1:發出請求..."); $simpleMediator->relay($this); //請中介者轉發 } } //具體同事類 class SimpleConcreteColleague2 implements SimpleColleague { public function __construct() { $simpleMediator = SimpleMediator::getMedium(); $simpleMediator->register($this); } public function receive() {print_r("具體同事類2:收到請求。");} public function send() { $simpleMediator = SimpleMediator::getMedium(); print_r("具體同事類2:發出請求..."); $simpleMediator->relay($this); //請中介者轉發 } } class Client { public static function main() { $c1 = new SimpleConcreteColleague1(); $c2 = new SimpleConcreteColleague2(); $c1->send(); print_r("-----------------"); $c2->send(); } } Client::main(); 結果: 具體同事類1:發出請求...具體同事類1:收到請求。-----------------具體同事類2:發出請求...具體同事類2:收到請求。 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看