跳至主要內容

合成复用原则

微信公众号:储凡2023/11/29大约 5 分钟

合成复用原则

尽量使用合成或者聚合的方式,而不是使用继承

合成复用原则鼓励开发者通过组合(合成)多个较小的对象来实现代码的复用,而不是通过继承来达到复用的目的。

通过合成而非继承,可以更灵活地组合对象以满足不同的需求,同时减少类之间的耦合性。

举例说明

这里通过一个例子对合成复用原则进行说明。例如:

定义一个 Logger 接口,表示日志记录器,具有 log 方法来记录日志。

然后,创建了两个实现 Logger 接口的类:ConsoleLoggerFileLogger

  • ConsoleLogger 类负责将日志输出到控制台
  • FileLogger 类负责将日志写入文件

接下来,创建 User 类,它接收一个 Logger 对象作为构造函数参数。User 类表示用户对象,其中的 save 方法执行保存用户的逻辑,并通过调用 Logger 对象的 log 方法来记录日志。

/**
 * 合成复用原则Demo
 */

interface Logger {
  log: (message: string) => void
}

class ConsoleLogger implements Logger {
  log(message: string): void {
    console.log(`[ConsoleLogger] ${message}`)
  }
}

class FileLogger implements Logger {
  log(message: string): void {
    console.log(`[FileLogger] ${message}`)
    // 将日志写入文件的具体实现
  }
}

class User {
  private logger: Logger

  constructor(logger: Logger) {
    this.logger = logger
  }

  save(): void {
    // 执行保存用户的逻辑
    this.logger.log('User saved.')
  }
}

// 使用示例
const consoleLogger = new ConsoleLogger()
const userWithConsoleLogger = new User(consoleLogger)
userWithConsoleLogger.save()

const fileLogger = new FileLogger()
const userWithFileLogger = new User(fileLogger)
userWithFileLogger.save()

通过这种设计,使用对象组合的方式,将日志记录的功能委托给了实现了 Logger 接口的类,而不是通过继承关系。 这样,在使用 User 类时,可以根据需要选择不同的日志记录器,实现了代码的复用和灵活性。 如果需要添加新的日志记录方式,只需实现 Logger 接口并创建对应的类,而不必修改 User 类的代码,符合合成复用原则。

合成复用原则的核心思想是通过组合已有的对象来实现复用,而不是通过继承来达到复用的目的。

这种方式更加灵活,减少了类之间的耦合性,使得系统更加可扩展和易维护。 同时,合成复用原则也鼓励开发人员思考对象之间的关联关系,通过合理的组合关系来构建更加健壮和可复用的代码。

更新日志

2025/5/18 18:01
查看所有更新日志
  • 24657-feat: 基于@142vip/vuepress对站点升级,简化配置、优化整体结构 (#234)
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 6b33b-feat(ES6): 新增2016新增特性和ts文档
  • e6a79-feat: 大幅新增设计模式、Linux命令、ORM框架教程文档