开放封闭原则
Open Closed Principle 简称OCP
什么是开放封闭原则
软件实体(类,模块,方法等等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展。
开放封闭原则的优点
- 开闭原则可以提高复用性
- 开闭原则可以提高维护性
如何做到开放封闭原则
- 抽象约束,抽象层尽量保持稳定,一旦确定即不允许修改。
- 元数据控制模块行为,即依赖倒置
- 封装变化
开闭原则其实就是对其它五大原则的实际运用。
代码举例
例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();
}