Javascript 需要一种设计模式,以便只获得跨类通用的特定特性
我必须为以下场景选择一种设计模式。虽然我将在Typescript中实现它,但我需要使它通用,以便跨语言实现它 问题是——假设我有一些功能Javascript 需要一种设计模式,以便只获得跨类通用的特定特性,javascript,python-2.7,typescript,design-patterns,Javascript,Python 2.7,Typescript,Design Patterns,我必须为以下场景选择一种设计模式。虽然我将在Typescript中实现它,但我需要使它通用,以便跨语言实现它 问题是——假设我有一些功能driveInAir(),driveOnRoad(),driveOnWater(),等等 现在我的类只包含这些特性的子集或全部。例如,一辆飞车可能在公路上行驶,在空中行驶,而一艘船可能在水上行驶。然而,这些功能的定义在不同的类中是通用的,因此我不想重新定义它们 此外,船舶不应能够访问driveOnRoad功能。我正在用Typescript开发它,但是选择的设计模
driveInAir()
,driveOnRoad()
,driveOnWater()
,等等
现在我的类只包含这些特性的子集或全部。例如,一辆飞车可能在公路上行驶,在空中行驶,而一艘船可能在水上行驶。然而,这些功能的定义在不同的类中是通用的,因此我不想重新定义它们
此外,船舶不应能够访问driveOnRoad功能。我正在用Typescript开发它,但是选择的设计模式也应该可以用其他语言扩展,比如python、Java等
其中一个理想的候选者是mixin,它是多重继承的另一种形式,我定义了一个类,其中只包含一个定义功能的函数。而class Ship或FlyingCar扩展了它所需要的类。但是混合/多重继承在不同的语言中不受支持,所以我不太喜欢它。还有其他建议吗?我的想法是这样的:
class Drive {
public driveInAir(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is flying!');
}
public driveOnRoad(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is driving on a road.');
}
public driveOnWater(vehicle: Vehicle): void {
console.log('Your ' + vehicle.Name + ' is motorboating!');
}
}
class Vehicle {
public Name: string;
}
class AirRoadVehicle extends Vehicle {
private _drive: Drive = new Drive();
driveInAir(): void {
this._drive.driveInAir(this);
}
driveOnRoad(): void {
this._drive.driveOnRoad(this);
}
}
class WaterVehicle extends Vehicle {
private _drive: Drive = new Drive();
driveOnWater(): void {
this._drive.driveOnWater(this);
}
}
class FlyingCar extends AirRoadVehicle {
constructor() {
super();
this.Name = 'Flying car';
}
goCrazy(): void {
this.driveOnRoad();
this.driveOnRoad();
this.driveInAir();
}
}
class Boat extends WaterVehicle {
constructor() {
super();
this.Name = 'Boat';
}
tryTakingTheHighroad(): void {
this.driveOnRoad(); //Property 'driveOnRoad' does not exist on type 'Boat'.
}
}
尽管你需要一些中产阶级来处理所有的案件
您可以尝试一下(运行时检查控制台的输出)。就设计而言,这看起来是一个不错的选择。mixin基本上在typescipt或任何其他语言中都做同样的事情(只是混合了不同类的功能)。定义类,实现功能,派生类用父类中定义的方法重写它们的方法。但这看起来更一般。比你好多了@没问题,如果这对你有帮助,请投票并标记为答案!