需要一种设计模式,只能获得跨类通用的特定功能

时间:2017-06-14 12:39:49

标签: javascript python-2.7 typescript design-patterns

我必须为以下场景选择设计模式。虽然我将在Typescript中实现它,但我需要使它成为通用的,以便跨语言实现它。

问题陈述是 - 让我们说我有功能driveInAir()driveOnRoad()driveOnWater()等等。

现在我的类只包含子集或所有这些功能。例如 - 一辆飞行汽车可能有driveOnRoad和driveInAir,而一艘船可能只有driveOnWater。但是,这些功能的定义在各个类别中都很常见,因此我不想重新定义它们。

船舶也不应该能够访问driveOnRoad功能。我在Typescript中开发它,但所选择的设计模式也应该可以扩展到其他语言,如python,Java等。

其中一个理想的候选者是mixins,它是多重继承的另一种形式,我定义了一个只包含一个定义功能的函数的类。而Ship或FlyingCar类扩展了它所需的类。但是语言不支持mixins / multiple inheritance,所以它不是我的忠实粉丝。还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

我正在思考这个问题:

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'.
    }
}

虽然你需要一些中产阶级来处理所有案件。

您可以尝试Here(运行时检查控制台输出)。