设计原则/设计模式

8 阅读4分钟

前言

要讲设计模式,首先应该知道设计原则。此处指的是SOLID面向对象五大原则,其与设计模式相辅相成。

SOLID面向对象设计原则

1.单一职责原则(SRP:single Responsibility Principle)

概念

一个类/模块应该只有一个引起它变化的原因,即只负责软件的一个功能区域,高内聚低耦合

优点

代码更容易维护测试,降低类的复杂度,提升代码可读性,降低变更引起的风险

示例

将数据持久化和业务逻辑分离到不同的类

2.开放封闭原则 (OCP:Open-Closed Principle)

概念

软件实体类应该对扩展开放,对修改关闭。即修改时避免更改原函数,通过抽象和多态实现功能扩展

优点

提高代码的可维护性和可复用性降低破坏现有代码的风险

示例

  • 使用策略模式替换条件分支
  • 实现validate函数应该独立不同类型,去implements实现接口,后续变更不应修改原函数,只应该添加不同的子类即可,或者父类提供一个新增方法,每次生成新的类都调用非手动更改初始函数

3.里约替换原则(LSP)

概念

子类必须可以完全替换基类,可以扩展父类的功能,但不能改变父类原有的功能,必须遵守父类的约定

优点

增强代码的健壮性,可复用性,保证继承体系的正确性

示例

  • 前端组件里面子组件应该扩展而非修改父组件的行为,字类的返回值应与父类兼容(react 子组件不应该更改父组件的默认行为)
  • 继承后新的valid类不应更改原validate的返回值类型,原基类返回true 这里返回对象

4.接口隔离原则(ISP)

概念

客户端不应该被迫依赖它不使用的接口,一个类不应该实现它不需要的方法,会造成接口臃肿,不必要的耦合,代码难以维护

优点

避免接口污染,提升接口的可复用性,降低系统耦合度

示例

将大型接口拆分成多个专用接口

5.依赖倒置原则(DIP)

概念

高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象,面向接口编程而非面向实现编程

优点

降低系统耦合度提升系统稳定性,提高代码可读性和可维护性,可以很方便的替换底层实现

示例

```js
// 开关方法细节为抽象,通过定义class去实现这个抽象类,Switch即为父级高层模块将细节交由抽象类实现
 interface Switchable {
     turnOn():void
     turnOff():void
     isOn:Boolean
 }
 class LightBulb implements Switchable {
     turnOn(){
         console.log('灯泡打开了')
     }
     ...
 }
 class Fan implements Switchable {
     turnOn(){
         console.log('风扇打开了')
     }
     ...
 }
 class Switch{
     constructor(private device:Switchable)
     toggle(){
         if(this.device.isOn){
             this.device.turnOff()
         }else{
             this.device.turnOn()
         }
     }
 }
 const bulbSwitch = new Switch(new LightBulb())
 bulbSwitch.switch() // 灯泡开了
 const fanSwitch = new Switch(new Fan())
 bulbSwitch.switch() // 风扇开了
```

设计模式

1.观察者模式

设计原则

遵循了开放封闭原则:Subject和Observer通过抽象接口聚合,新增观察者无需修改Subject代码(对扩展开放,对修改关闭) 单一职责原则 被观察者(Subject)负责维护观察者列表和通知逻辑,观察者(Observer)负责自身响应逻辑,职责分离

代码实现

 // 被观察者
 class Subject {
     constructor(private obsvers = [])
     addObserver(observer){
         this.observers.push(observer)
     }
     notify(data){
         this.observers.forEach(ob=>ob.update(data))
     }
 }
 // 观察者
 class Observer {
     update(data){
         console.log('我是观察者1',通知我执行,data)
     }
 }
 ...
 const subject = new Subject()
 subject.addObserver(new Observer)
 subject.notify('hello')

2.发布订阅模式

设计原则

  • 遵循开放封闭原则,可以添加新的发布者和订阅者而不需要更改底层逻辑
  • 遵循单一职责原则,发布者只负责发布不关心谁接收,订阅者只处理对应的事件不关心谁发布的,事件中心只负责管理事件和转发消息
  • 遵循接口隔离原则 发布者只实现emit接口订阅者只实现on接口不会被迫依赖不需要的方法

代码实现

class EventListeners{
    this.events = {}
    on(eventName,cb){
        
    }
    emit(eventName,...args){
        this.events[eventName] = args
    }

}