类的继承和组合设计模式的主要差异
- 实现方式
- 继承:通过
extends
关键字实现,子类继承父类的属性和方法,子类可以重写父类的方法,也可以添加新的属性和方法。
- 组合:通过在一个类中包含另一个类的实例来实现,通过调用包含实例的方法来实现功能。
- 应用场景
- 继承:适用于有明确的“是一种”(is - a)关系的场景,例如,管理员用户“是一种”用户,此时可以用继承。它强调代码的复用,子类可以直接复用父类的代码。
- 组合:适用于有“有一个”(has - a)关系的场景,例如,用户“有一个”权限集合,更强调灵活性和可维护性,因为组合对象之间耦合度相对较低。
使用继承构建用户权限管理模块
// 基类:用户
class User {
constructor(public username: string) {}
checkPermission(permission: string): boolean {
// 这里只是简单示例,实际可以有更复杂逻辑
return false;
}
}
// 子类:管理员用户,继承自User
class AdminUser extends User {
constructor(username: string) {
super(username);
}
checkPermission(permission: string): boolean {
// 管理员用户可以有不同的权限检查逻辑
return true;
}
}
使用组合构建用户权限管理模块
// 权限类
class Permission {
checkPermission(permission: string): boolean {
// 这里只是简单示例,实际可以有更复杂逻辑
return false;
}
}
// 用户类,通过组合使用Permission类
class User {
constructor(public username: string, private permission: Permission) {}
checkPermission(permission: string): boolean {
return this.permission.checkPermission(permission);
}
}
// 管理员权限类,继承自Permission
class AdminPermission extends Permission {
checkPermission(permission: string): boolean {
return true;
}
}
// 创建管理员用户时使用AdminPermission实例
let adminPermission = new AdminPermission();
let adminUser = new User('admin', adminPermission);