zoukankan      html  css  js  c++  java
  • 适配器模式

    –参考书籍《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();

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

    如果我能一直坚持下去,就像坚持当初的梦想一样,或许我也能成为大神呢,哈哈哈。
  • 相关阅读:
    使用jsonEditor打造一个复杂json编辑器
    【原创】一次“诡异”的容器Unix Socket通信问题分析
    【原创】Ingress-Nginx-Controller的Metrics监控源码改造简析
    IDEA+DevTools实现热部署功能
    ElementUI按需引入各种组件
    vue-cli4.0更新后怎样将eslint关闭
    Mysql修改字段名、修改字段类型
    博客搬家CSDN
    如何优雅的处理Restful
    java系列之注解
  • 原文地址:https://www.cnblogs.com/faraway-tiny/p/4918368.html
Copyright © 2011-2022 走看看