美文网首页
设计模式js篇--适配器模式

设计模式js篇--适配器模式

作者: 我追求的小世界 | 来源:发表于2019-03-18 16:22 被阅读0次
    一、定义

    将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    使用场景:
    1、使用一个已经存在的对象,但其方法或属性接口不符合我们的要求。
    2、想要创建一个可复用对象,该对象可以与其他不相关的对象或不可见的对象协同工作
    3、想使用的对象已经存在,但是不能对每一个都进行原型继承以匹配它的接口。对象适配器可以适配它的父对象接口方法或属性。

    二、举例

    eg1: github上面原有的例子(https://github.com/sohamkamani/javascript-design-patterns-for-humans#-composite)。

    // 场景:一个有猎人的游戏,猎人猎杀狮子--符合使用场景1
    // 不同类型的狮子吼叫
    class AfricanLion   {
         roar () {}
    }
    class AsianLion   {
         roar () {}
    }
    // 搜索不同的狮子进行猎杀
    class Hunter {
        hunt(lion) {
            // ... some code before
            lion.roar()
            //... some code after
        }
    }
    // 猎人也要追捕狗 但此时界面是不同的,为了与猎人兼容 需要创建一个兼容的适配器
    class WildDog {
        bark () {}
    }
    
    class WildDogAdapter {
        constructor(dog) {
            this.dog = dog;
        }    
        roar() {
            this.dog.bark();
        }
    }
    // 调用
    wildDog = new WildDog()
    wildDogAdapter = new WildDogAdapter(wildDog)
    
    hunter = new Hunter()
    hunter.hunt(wildDogAdapter)
    
    

    eg2:参数适配

     // 参数适配模拟eg1:
    function add (x1, x2, x3) {
      console.log(x1 + x2 + x3);
    }
    // 存在一个对象数据
    var obj = {
      a: '我',
      b: '很',
      c: '帅'
    }
    function adapter (o) {
      // 通过适配器函数来调用目的api
      add(o.a, o.b, o.c);
    } 
    adapter(obj);
    
    
    // 参数适配eg2: 项目中调用接口
    fetchCompanyWalletComponent (componentType, authType, orderCode = '', jrId='') {
        let param = { componentType, authType, orderCode, jrId }
        $http.fetchCompanyWalletApi(param).then(data => {
          window.location.href = data.data
        })
      }
    
    // fetchCompanyWalletApi接口
     fetchCompanyWalletApi(param) {
        let url = 'xxxxx'
        return $http.post(url, param)
      },
    

    eg3:数据的适配

    // 使用Echarts折线图对网站每周的uv,通常后端返回的数据格式如下
    [
      {
        "day": "周一",
        "uv": 6300
      },
      {
        "day": "周二",
        "uv": 7100
      },  {
        "day": "周三",
        "uv": 4300
      },  {
        "day": "周四",
        "uv": 3300
      },  {
        "day": "周五",
        "uv": 8300
      },  {
        "day": "周六",
        "uv": 9300
      }, {
        "day": "周日",
        "uv": 11300
      }
    ]
    // Echarts需要的x轴的数据格式和坐标点的数据是长下面这样的:
    ["周二", "周二", "周三", "周四", "周五", "周六", "周日"] //x轴的数据
    [6300. 7100, 4300, 3300, 8300, 9300, 11300] //坐标点的数据
    
    // 将后端的返回数据做适配
    //x轴适配器
    function echartXAxisAdapter(res) {
      return res.map(item => item.day);
    }
    //坐标点适配器
    function echartDataAdapter(res) {
      return res.map(item => item.uv);
    }
    
    三、总结

    适配器模式在JS中的使用场景很多,基本思想就是用一个新的接口对现有的接口进行包装,处理类与API的不匹配。

    优点:
    1、将目标类和适配者类解耦
    2、增加了复用性和扩展性

    缺点:
    过多地使用适配器,会让系统非常零乱,不易整体进行把握。
    (比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。)

    相关文章

      网友评论

          本文标题:设计模式js篇--适配器模式

          本文链接:https://www.haomeiwen.com/subject/mzivmqtx.html