• 适配器模式


    –参考书籍《php设计模式》
    当外部API库改变时,如何让使用者动态的升级?
    运用适配器(Adapter)模式来避免因外部库改变所带来的不便。

    如向上兼容举例:
    使用者版本1-hello ——> 最新库的-haoo(库版本1时,是hello方法)
    使用者版本2-greet ——> 最新库的-haoo(库版本2时,hello方法消失,变成greet方法)
    使用者版本3-haoo ——> 最新库的-haoo(版本库3时,greet方法也消失,变成haoo方法)

    <?php
    //version1
    /*
    class HwLib {
     function hello(){
         return 'Hello ';
     } 
     function world() {
         return 'World!';
     }
    }
    $s = new HwLib;
    echo $s->hello(),$s->world();
    */
    // version 2
    /*
    class HwLib {
     //此时库的greet完全替代了hello,使用库的代码也必须做出相应的改变,问题:如何才能让使用者不变呢?
     function greet(){
         return 'Greetings and Salutations ';
     }
     function world() {
         return 'World!'."
    ";
     }
    }
    */
    // version 3
    class HwLib {
     //此时库的haoo完全替代了greet
     function haoo(){
         return 'haoo++++++++ ';
     }
     function world() {
         return 'World!'."
    ";
     }
    }
    /*组合的方式实现适配器*/
    class HwLibV2ToV1Adapter{
     var$libv2;
     function HwLibV2ToV1Adapter(&$libv2) {
         $this->libv2 = &$libv2;
     }
     function hello(){
         return $this->libv2->greet();
     }
     function world() {
         return $this->libv2->world();
     } 
    }
    class HwLibV3ToV2Adapter{
     var$libv3;
     function HwLibV3ToV2Adapter(&$libv3) {
         $this->libv3 = &$libv3;
     }
     function greet(){
         return $this->libv3->haoo();
     }
     function world() {
         return $this->libv3->world();
     } 
    }
    //工厂模式生成
    function & HwLibInstance($ver='') {
     switch ($ver) {
     case 'V3':
         return new HwLib;
     case 'V2':
         return new HwLibV3ToV2Adapter(new HwLib); 
     default:
         return new HwLibV2ToV1Adapter(new HwLibV3ToV2Adapter(new HwLib));
     }
    } 
    $s = HwLibInstance('V1');
    echo $s->hello(),$s->world();
    $s = HwLibInstance('V2');
    echo $s->greet(),$s->world();
    $s = HwLibInstance('V3');
    echo $s->haoo(),$s->world();
    //通过继承实现适配器
    class HwLibGofV2ToV1Adapter extends HwLib{ 
     function hello(){
         return parent::greet();
     } 
    }
    class HwLibGofV3ToV2Adapter extends HwLibGofV2ToV1Adapter{
     function hello(){
         return parent::haoo();
     } 
     function greet(){
     //return parent::haoo();
         return $this->haoo();
     }
    }
    //工厂模式生成
    function & HwLibInstanceGof($ver='') { 
         return new HwLibGofV3ToV2Adapter;
    }
    $s = HwLibInstanceGof('V1');
    echo $s->hello(),$s->world();
    $s = HwLibInstanceGof('V2');
    echo $s->greet(),$s->world();
    $s = HwLibInstanceGof('V3');
    echo $s->haoo(),$s->world();

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    如果我能一直坚持下去,就像坚持当初的梦想一样,或许我也能成为大神呢,哈哈哈。
  • 相关阅读:
    使用select和shutdown
    SMTP协议初探(二)linux下c编程实现发邮件
    ortp使用详解 ortprelease.pdf
    网易校园招聘c++题目如何让new操作符不分配内存,只调用构造函数
    虚拟地址空间,堆栈,堆,数据段,代码段
    关于double的输入输出
    CodeForces1238DABstring CodeForces思维+字符串反向思考
    CodeForces1234CPipesdfs
    CodeForces1221A2048 Game思维题
    排序
  • 原文地址:https://www.cnblogs.com/faraway-tiny/p/4918368.html
Copyright © 2020-2023  润新知