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

                >橋接模式 (Bridge Pattern):將抽象與實現解耦,使得兩者可以獨立的變化 ## (一)為什么需要橋接模式 1,如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。 2,抽象化角色和實現化角色可以以繼承的方式獨立擴展而互不影響,在程序運行時可以動態將一個抽象化子類的對象和一個實現化子類的對象進行組合,即系統需要對抽象化角色和實現化角色進行動態耦合。 3,雖然在系統中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。 ## (二)橋接模式UML圖 ![](https://box.kancloud.cn/82727166947cca2241c2ca3338a49561_1003x543.png) * Abstraction為抽象化角色,主要職責是定義該角色的行為,同時保存一個對實現化角色的引用。 * Implementor為實現化角色,它是一個接口或抽象類。在PHP中一般是抽象類。 有點不知所云吧。我學的時候也是。老規矩,來個實例吧。 ## (三)簡單實例 如果我現在是小米公司的雷布斯,小米公司旗下有小米mix和小米note手機,現在有一個底層的語音輸出軟件,由于小米mix的全面屏設計沒有開孔使用了骨傳導,所以和小米note有些不同。那么我們要如何來設計這個輸出功能呢? 傳統的做法就應該是,一個抽象手機品牌,mix和note手機品牌繼承抽象手機品牌。然后有一個mix品牌的輸出軟件繼承自mix品牌。如果這時候有一個redmi的牌子的輸出軟件就應繼承自redmi品牌,redmi繼承抽象手機品牌。 如果除了這個語音輸出軟件,我們還有其它的軟件呢,一個手機有很多軟件,那么這種繼承,如果畫出繼承鏈的話,那一個品牌下得有多少子類? 如果我們使用橋接模式的話,就可以把這個軟件的具體實現與抽象品牌分離出來,這樣也能是我們動態增減實現化角色時更為方便。 <?php //抽象化角色 abstract class MiPhone{ protected $_audio; //存放音頻軟件對象 abstract function output(); public function __construct(Audio $audio){ $this->_audio = $audio; } } //具體手機 class Mix extends MiPhone{ //語音輸出功能 public function output(){ $this->_audio->output(); } } class Note extends MiPhone{ public function output(){ $this->_audio->output(); } } //實現化角色 功能實現者 abstract class Audio{ abstract function output(); } //具體音頻實現者 -骨傳導音頻輸出 class Osteophony extends Audio{ public function output(){ echo "骨傳導輸出的聲音-----哈哈".PHP_EOL; } } //普通音頻輸出---聲筒輸出 class Cylinder extends Audio{ public function output(){ echo "聲筒輸出的聲音-----呵呵".PHP_EOL; } } //讓小米mix和小米note輸出聲音 $mix = new Mix(new Osteophony); $mix->output(); $note = new Note(new Cylinder); $note->output(); 這樣寫的好處是把抽象化角色手機和實現化角色手機的具體功能音頻輸出 分離了出來。如果現在最新的小米note系列也要用上骨傳導輸出,那么我們只需實例化時傳入的聲筒音頻類改為骨傳導音頻類。如果我們還有一個揚聲器輸出,小米mix和小米note都有這個功能。我們只需要再添加一個揚聲器輸出類繼承Audio類,然后誰使用就保存這個實例在屬性中。沒有橋接模式的話,我們可是要寫兩個,一個是小米mix的揚聲器輸出,一個是小米note。 如果揚聲器輸出對小米mix和小米note不一樣,那么我們確實需要寫兩個揚聲器輸出類。使用橋接模式,依然比原來直接繼承好,就是因為有一天揚聲器技術驅動更新了,我們要更新揚聲器不用修改手機類代碼,而只需傳入一個更新的揚聲器類。
                  <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>

                              哎呀哎呀视频在线观看