六大设计原则-开放封闭原则

开放封闭原则

Open Closed Principle 简称OCP

什么是开放封闭原则

软件实体(类,模块,方法等等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展。

开放封闭原则的优点

  1. 开闭原则可以提高复用性
  2. 开闭原则可以提高维护性

如何做到开放封闭原则

  1. 抽象约束,抽象层尽量保持稳定,一旦确定即不允许修改。
  2. 元数据控制模块行为,即依赖倒置
  3. 封装变化

开闭原则其实就是对其它五大原则的实际运用。

代码举例

例1一开始有小说类,后来增加了打折逻辑,则不能去修改当前的类,应该去增加新的子类来扩展变化。

class IBook {
  constructor() {}
  getName() {}
  getPrice() {}
}

class NovelBook extends IBook {
  constructor(name, price) {
    super();
    this.name = name;
    this.price = price;
  }

  getName() {
    return this.name;
  }

  getPrice() {
    return this.price;
  }
}

let novel = new NovelBook("笑傲江湖", 100);

class DisNovelBook extends NovelBook {
  constructor(name, price) {
    super(name, price);
  }

  getPrice() {
    if (this.price > 50) {
      return this.price * 0.9;
    } else {
      return this.price;
    }
  }
}

let novel = new DisNovelBook("笑傲江湖", 100);

例2通过找出程序中可能发生变化的地方,封装变化来达到开放封闭原则

class Duck {}
class Chicken {}

function makeSound(animal) {
  if (animal instanceof Duck) {
    console.log("嘎嘎嘎");
  } else if (animal instanceof Chicken) {
    console.log("咯咯咯");
  }
}

// 新增Dog需求
class Duck {}
class Chicken {}
class Dog {}

function makeSound(animal) {
  if (animal instanceof Duck) {
    console.log("嘎嘎嘎");
  } else if (animal instanceof Chicken) {
    console.log("咯咯咯");
  } else if (animal instanceof Dog) {
    console.log("汪汪汪");
  }
}

//重构
class Duck {
  sound() {
    console.log("嘎嘎嘎");
  }
}
class Chicken {
  sound() {
    console.log("咯咯咯");
  }
}
function makeSound(animal) {
  animal.sound();
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容