php設計モードのアダプタモード


アダプタモードは、クラスアダプタとオブジェクトアダプタの2種類に分けられます
参考にするhttp://blog.csdn.net/hguisu/article/details/7527842
適用:
  • 既存のクラスを使用したいのですが、そのインタフェースはあなたのニーズに合っていません.
  • 他の関連のないクラスまたは予見不可能なクラスと協働して作業できる多重化可能なクラスを作成したいです.
  • (オブジェクトアダプタのみ)既存のサブクラスを使用したい場合は、各サブクラスをサブクラス化してインタフェースに一致させることはできません.オブジェクトアダプタは、親インタフェースに適しています.すなわち、adapteeを間接的に取得するために追加のポインタは必要ありません.

  • 原理:
    使用するロールは、targetが最も早く実装されたインタフェース、adapteeが改善されたインタフェース、adapterがtargetとadapterを適切に割り当て、clientがインタフェースを呼び出します.
    クラスアダプタ:
    <?php  
    /** *        * @author mtg * */  
    
    /** *      * @version 1.0 */  
    class Target {  
    
        /** *             */  
        public function hello(){  
            echo 'Hello ';  
        }  
    
        /** *     */  
        public function world(){  
            echo 'world';  
        }  
    }  
    
    /** * Client     target       * */  
    class Client {  
    
        public static function main() {  
            $Target = new Target();  
            $Target->hello();  
            $Target->world();  
    
        }  
    
    }  
    Client::main();  
    ?>  

    Targetはhello()メソッドが将来のバージョンで改善され、サポートされたり淘汰されたりしないことを明確に指摘しています.次に、第2版のTargetがリリースされたと仮定します.hello()の代わりに新しいgreet()メソッドが使用されました.
    <?php  
    /** *        * @author guisu * */  
    
    /** *      * @version 2.0 */  
    class Target {  
    
        /** *               */  
        public function greet(){  
            echo 'Greet ';  
        }    
        public function world(){  
            echo 'world';  
        }  
    }  

    もし私たちが元のclientコードを使い続けたら、間違いを報告し、hello方法が見つからないに違いありません.APIの「アップグレード」の解決策は、アダプタ(Adapter)を作成することです.
    <?php  
    /** *        * @author mtg * */  
    
    /** *      * @version 2.0 */  
    interface Target {  
    
        /** *    target         */  
        public function hello();  
    
        /** *     */  
        public function world();  
    }  
    
    /** *    :      ,      */  
    class Adaptee {  
        /** *         */  
        public function world() {  
            echo ' world <br />';  
        }  
    
        /** *        */  
        public function greet() {  
            echo ' Greet ';  
        }  
    }  
    
    /** *           adaptee   target,   adapter     ,   world(),greet(), hello()  ,  hello        greet  ,  ,            ,             */  
    class Adapter extends Adaptee implements Target {  
    
        /** *          hello   */  
        public function hello() {  
           parent::greet();  
        }  
    
    }  
    /** *       * */  
    class Client {  
        public static function main() {  
            $adapter = new Adapter();  
            $adapter->hello();  
            $adapter->world();  
        }  
    }  
    Client::main();  
    ?>  
    
    

    オブジェクトアダプタ
    <?php  
    /** *         * @author guisu * */  
    
    /** *      * @version 2.0 */  
    interface Target {  
    
        /** *      :              */  
        public function hello();  
    
        /** *     */  
        public function world();  
    }  
    
    /** *    :       */  
    class Adaptee {  
        /** *         */  
        public function world() {  
            echo ' world <br />';  
        }  
    
        /** *        */  
        public function greet() {  
            echo ' Greet ';  
        }  
    }  
    
    /** *  adapter   adptee   ,  adapter      adaptee   ,adapter        ,           */  
    class Adapter  implements Target {  
    
        private $_adaptee;  
    
        public function __construct(Adaptee $adaptee) {  
            $this->_adaptee = $adaptee;  
        }  
    
        /** *       , greet()     hello() */  
        public function hello() {  
           $this->_adaptee->greet();  
        }  
    
        /** *       ,     world()         world    */  
        public function world() {  
           $this->_adaptee->world();  
        }  
    }  
    /** *       * */  
    class Client {  
    
        /** * Main program. */  
        public static function main() {  
            $adaptee = new Adaptee();  
            $adapter = new Adapter($adaptee);  
            $adapter->hello();  
            $adapter->world();  
        }  
    }  
    
    Client::main();  
    ?>