<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之旅 廣告
                適配器(Adapter)模式:將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。 >[danger]適配器模式分為類結構型模式和對象結構型模式兩種,前者類之間的耦合度比后者高,且要求程序員了解現有組件庫中的相關組件的內部結構,所以應用相對較少些。 **該模式的主要優點如下。** * 客戶端通過適配器可以透明地調用目標接口。 * 復用了現存的類,程序員不需要修改原有代碼而重用現有的適配者類。 * 將目標類和適配者類解耦,解決了目標類和適配者類接口不一致的問題。 **其缺點是:** 對類適配器來說,更換適配器的實現過程比較復雜。 應用場景:老代碼接口不適應新的接口需求,或者代碼很多很亂不便于繼續修改,或者使用第三方類庫。 想使用一個已存在的類,但是該類不符合接口需求;或者需要創建一個可重用的類,適配沒有提供合適接口的其它類。 一句話總結:不改變原有類的情況下對其進行改造 ## **①第一種方式:對象適配器** ~~~ //老的接口代碼 class User { private $name; function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } //新代碼,開放平臺標準接口 interface UserInterface { function getUserName(); } class UserInfo implements UserInterface { protected $user; function __construct($user) { $this->user = $user; } public function getUserName() { return $this->user->getName(); } } $olduser = new User('張三'); echo $olduser->getName()."n";//張三n $newuser = new UserInfo($olduser); echo $newuser->getUserName()."n";//張三n ~~~ >[danger]**注意點**: 這里的新接口使用了組合方式,UserInfo內部有一個成員變量保存老接口User對象,模塊之間是松耦合的,這種結構其實就是組合模式。不要使用繼承,雖然UserInfo繼承User也能達到同樣的目的,但是耦合度高,相互產生影響。 新能源汽車的發動機有電能發動機(Electric Motor)和光能發動機(Optical Motor)等,各種發動機的驅動方法不同,例如,電能發動機的驅動方法 electricDrive() 是用電能驅動,而光能發動機的驅動方法 opticalDrive() 是用光能驅動,它們是適配器模式中被訪問的適配者。 客戶端希望用統一的發動機驅動方法 drive() 訪問這兩種發動機,所以必須定義一個統一的目標接口 Motor,然后再定義電能適配器(Electric Adapter)和光能適配器(Optical Adapter)去適配這兩種發動機 ``` //目標:發動機 interface Motor { public function drive(); } //適配者1:電能發動機 class ElectricMotor { public function electricDrive() { echo "電能發動機驅動汽車!"; } } //適配者2:光能發動機 class OpticalMotor { public function opticalDrive() { echo "光能發動機驅動汽車!"; } } //電能適配器 class ElectricAdapter implements Motor { private $emotor; public function ElectricAdapter() { $this->emotor=new ElectricMotor(); } public function drive() { $this->emotor->electricDrive(); } } //光能適配器 class OpticalAdapter implements Motor { private $omotor; public function OpticalAdapter() { $this->omotor=new OpticalMotor(); } public function drive() { $this->omotor->opticalDrive(); } } //客戶端代碼 class MotorAdapterTest { public static function main($class) { echo "適配器模式測試:"; $motor=new $class(); $motor->drive(); } } MotorAdapterTest::main("ElectricAdapter"); MotorAdapterTest::main("OpticalAdapter"); ``` ## **②第二種方式:類適配器** ![](https://img.kancloud.cn/56/ab/56abbf41f2d0aa10ab9b9340857e0d9b_639x326.png) ``` //目標接口 interface Target { public function request(); } //適配者接口 class Adaptee { public function specificRequest() { echo "適配者中的業務代碼被調用!"; } } //類適配器類 class ClassAdapter extends Adaptee implements Target { public function request() { $this->specificRequest(); } } //客戶端代碼 class ClassAdapterTest { public static function main() { echo "類適配器模式測試:"; $target = new ClassAdapter(); $target->request(); } } ClassAdapterTest::main(); ``` ~~~ interface Target2 { public function sampleMethod1(); public function sampleMethod2(); } class Adaptee1 { // 源角色 public function sampleMethod1() {echo '++++++++';} } class Adapter2 extends Adaptee1 implements Target2 { // 適配后角色 public function sampleMethod2() {echo '————————';} } $adapter = new Adapter2(); $adapter->sampleMethod1();//輸出:++++++++ $adapter->sampleMethod2();//輸出:———————— ~~~ ## **模式的擴展**:雙向適配器模式 雙向適配器類既可以把適配者接口轉換成目標接口,也可以把目標接口轉換成適配者接口 ![](https://img.kancloud.cn/8c/58/8c5862955e4082b51a4a8d4a5a87bceb_499x608.png) ``` //目標接口 interface TwoWayTarget { public function request(); } //適配者接口 interface TwoWayAdaptee { public function specificRequest(); } //目標實現 class TargetRealize implements TwoWayTarget { public function request() { echo "目標代碼被調用!"; } } //適配者實現 class AdapteeRealize implements TwoWayAdaptee { public function specificRequest() { echo "適配者代碼被調用!"; } } //雙向適配器 class TwoWayAdapter implements TwoWayTarget,TwoWayAdaptee { private $target; private $adaptee; public function __construct($class){ if ($class instanceof TwoWayTarget) { $this->target=$class; } if ($class instanceof TwoWayAdaptee) { $this->adaptee=$class; } } public function request() { $this->adaptee->specificRequest(); } public function specificRequest() { $this->target->request(); } } //客戶端代碼 class TwoWayAdapterTest { public static function main() { echo "目標通過雙向適配器訪問適配者:"; $adaptee=new AdapteeRealize(); $target=new TwoWayAdapter($adaptee); $target->request(); echo "-------------------"; echo "適配者通過雙向適配器訪問目標:"; $target=new TargetRealize(); $adaptee=new TwoWayAdapter($target); $adaptee->specificRequest(); } } TwoWayAdapterTest::main(); ```
                  <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>

                              哎呀哎呀视频在线观看