最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 『面试的底气』—— 设计模式之接口隔离原则|8月更文挑战

    正文概述 掘金(红尘炼心)   2021-08-07   469

    这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

    前言

    在面试高级前端时,往往会遇到一些关于设计模式的问题,每次都回答不太理想。恰逢8月更文挑战的活动,准备用一个月时间好好理一下关于设计模式方面的知识点,给自己增加点面试的底气。

    在学习设计模式之前,首先要认识到设计模式是个编程思想,对任何编程语言都适用。其次要从设计模式的原则开始学习,故本文将详细介绍设计模式的原则之一接口隔离原则

    官方定义

    客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

    自己的理解

    客户端应该理解为一个类,那么类不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。接口从前端的角度来理解,可认为类中对外暴露的方法。来试想一下遵循接口隔离原则会得到什么好处,没好处干嘛要去遵循。

    接口隔离,从隔离的字眼来判断,隔离意味接口之间互不干扰,互不依赖。另外被隔离的事物应该具有相同的特征才能被隔离,比如接口A和接口B都是为类C服务,就抽像一个类把接口A和接口B隔离起来。而且隔离还要一个非常重要的作用,就是防止被污染。那么接口隔离的好处归纳一下有以下几点

    • 避免接口污染
    • 提高灵活性
    • 提供定制服务
    • 实现高内聚

    看到高内聚,是不是想起单一职责原则也有这个功能。但是接口隔离原则与单一职责原则的审视角度不相同。单一职责原则要求是类的职责单一,注重的职责,这是业务逻辑上的划分。接口隔离原则要求类中的方法(接口)尽量少。

    下面用代码演示一下接口隔离原则,其中copyProperties方法是将一个类的属性复制到另一个类上,mix方法是将两个类进行合并。

    根据接口隔离原则,先把猫和狗的“吃饭”和“叫”两个共同行为抽像到Behavior类中隔离,猫特的“爬树”行为抽像到Action类中隔离。然后创造狗类时执行class Dog extends Behavior即可,而创建猫类前要先执行const CatMin = mix(Behavior, Action)Behavior类和Action类组合成一个新抽像类CatMin,然后在执行class Cat extends CatMin创建猫类。

    其中Behavior类和Action类就是遵循接口隔离原则的产物。

    function copyProperties(target, source) {
      for (let key of Reflect.ownKeys(source)) {
        if (key !== "constructor" && key !== "prototype" && key !== "name") {
          let desc = Object.getOwnPropertyDescriptor(source, key);
          Object.defineProperty(target, key, desc);
        }
      }
    }
    function mix(...mixins) {
      class Mix { }
      for (let mixin of mixins) {
        copyProperties(Mix, mixin);
        copyProperties(Mix.prototype, mixin.prototype);
      }
      return Mix;
    }
    class Behavior {
      // 吃
      eat(data) {
        console.log(data)
      }
      // 叫
      call(data) {
        console.log(data)
      }
    }
    class Action {
      // 爬树
      climbTree(data) {
        console.log(data)
      }
    }
    class Dog extends Behavior {
      diyEat(data) {
        this.eat(`狗在吃${data}`)
      }
      diyCall() {
        this.call('汪汪汪,我饿了')
      }
    }
    const CatMin = mix(Behavior, Action);
    class Cat extends CatMin {
      diyEat(data) {
        this.eat(`猫在吃${data}`)
      }
      diyCall() {
        this.call("喵喵喵,我饿了")
      }
      diyClimbTree() {
        this.climbTree("爬树很开心哦~")
      }
    }
    let dog = new Dog();
    dog.diyEat("骨头");//狗在吃骨头
    dog.diyCall();//汪汪汪,我饿了
    let cat = new Cat();
    cat.diyEat("鱼");//猫在吃鱼
    cat.diyCall();//喵喵喵,我饿了
    cat.diyClimbTree();//爬树很开心哦~
    

    起源地下载网 » 『面试的底气』—— 设计模式之接口隔离原则|8月更文挑战

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元