合成复用原则
2023/11/29大约 5 分钟
合成复用原则
尽量使用合成或者聚合的方式,而不是使用继承
合成复用原则鼓励开发者通过组合(合成)多个较小的对象来实现代码的复用,而不是通过继承来达到复用的目的。
通过合成而非继承,可以更灵活地组合对象以满足不同的需求,同时减少类之间的耦合性。
举例说明
这里通过一个例子对合成复用原则进行说明。例如:
定义一个 Logger 接口,表示日志记录器,具有 log 方法来记录日志。
然后,创建了两个实现 Logger 接口的类:ConsoleLogger 和 FileLogger。
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-于c0f2d-于6b33b-于e6a79-于
