Loading

设计模式-设计原则

设计就是按照哪一种思路或者标准来实现功能,功能相同,可以有不同的设计方式。需求如果不断变化,设计的作用才会提现出来。

设计原则

放开封闭原则(Open-Closed Principle)

软件实体(类、模块、函数)应该是被扩展,但是不可以被修改。

特点:

  • 对扩展开发的,对修改关闭。
  • 增加需求时,扩展新代码,而非需改已有代码
  • 开放封闭原则是设计模式化中的总原则
  • 对近期可能会变化,并且如果变化改动量很大的地方要增加扩展点,扩展点过多会降低代码的可读性
class Customer {
  public discount: number;
  public rank: string;
  constructor(rank: string, discount: number = 1) {
    this.rank = rank;
    this.discount = discount;
  }
  getDiscount() {
    return this.discount;
  }
}
class Product {
  constructor(public name: string, public price: number) {
    this.price = price;
  }
  cost(customer: Customer) {
    return this.price * customer.getDiscount();
  }
}
const computer = new Product('冰箱', 1000);
const m1 = new Customer('member', 0.85);
const vip = new Customer('vip', 0.7);
const guest = new Customer('guest');
console.log(computer.cost(m1)) // 850
console.log(computer.cost(vip)) // 700
console.log(computer.cost(guest)) // 1000

开放封闭原则可以具有两个号的可扩展性和可维护性。
在某些情况下,有一些代码是无论如何也不能完全封闭的,总会存在一些无法对其封闭的变化。但是可以做到的有下面两点:

  • 找出最容易发生变化的地方,然后把这些地方抽象封闭这些变化。
  • 在不可避免发生修改的时候,尽量修改那些相对容易修改的地方。

单一职责原则(Single-Closed Principle)

单一职责原则的职责被定义为“引起变化的原因”。如果我们有两个动机去写一个方法,那么这个方法就具有两个职责。每个职责变化都是一个轴线,如果一个方法承担了过多的职责,那么在以后的需求变动过程中,需要改动这个方法的可能性就越大。因此 单一职责原则体现为一个对象(方法)只做一件事情。

特点:

  • 一个类或、方法、模块要尽可能单一,不要太杂。
  • 单一职责可以降低类的复杂性,提高代码可读性和可维护性。
  • 当类代码、方法过多、功能太多、职责太多的时候就要对其进行拆分了
  • 拆分不能过度,否则会顺势内聚合性和维护性

里氏替换原则(Liskov Substitution Principle)

特点

  • 所有引用基类的地方必须能透明地使用其子类对象
  • 子类能替换父类,使用者可能根部就不需要知道是父类还是子类,反之则不行
  • 里氏替换原则是开放封闭原则的实现基础,程序设计的时候尽量使用基类的定义及引用,运行时再决定使用哪个子类
  • 历史替换原则可以提高代码的复用性,提高代码的可扩展性,也增加了耦合性
  • 现对于多态,这个原则是讲的是类如何设计,子类如果违反了父类的功能则表示违反了里氏替换原则

接口隔离原则(Interface Segregation Priciple)

依赖反转原则(Dependence Inversion Priciple)

迪米特法则(Law of Demeter)

迪米特法则也叫最少知识原则,一个软件实体应当尽当可能少地与其他实体发生相互作用。

减少对象之间的联系。单一职责原则指导吧对象划分较小的颗粒,以提高对象的可复用性。但越来越多的对象之间可能会产生一些关系,如果修改了其中的一个对象,也很有可能会影响到跟它相互引用的其他对象。迪米特法则则要求在程序设计时,要尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么这两个对象就不要发生直接联系。可以引入一个第三者对象来承担这两个对象之间的通信。

合成复用原则(Composite Reuse Priciple)

类与类之间的关系:

  • 关联(单向关联和双向关联)
  • 泛化
  • 依赖
//关联
class Category {
  public products: Array<Product>
}

class Product{
  public category: Category;
}

总结

  • 开放封闭原则是设计原则的核心,对修改关闭,对扩展开放是软件设计的基石
  • 单一职责要求我们设计接口和模块功能的时候尽量保证单一性和原子性,修改一个不会影响全局和其他模块
  • 历史替换原则和依赖倒置原则要求面向接口和抽象变成,不要依赖具体的实现,否则实现一改,上层调用就要对应修改
  • 最少知识原则则要求减少对象之间的相互作用
posted @ 2021-06-08 10:40  vincent_cyi  阅读(51)  评论(0编辑  收藏  举报