【问题标题】:Which design pattern to use when multiple inheritance is needed in java [duplicate]java中需要多重继承时使用哪种设计模式[重复]
【发布时间】:2014-04-15 12:22:24
【问题描述】:

我有一个车辆类,并且很好地实施了船舶和飞机来检查安全性,每个类都实施自己的安全检查。世界很好。

interface Vehicle {
    public void safetyCheck();
}


class Ship implements Vehicle {
    @Override
    public void safetyCheck() {
        //check if number of lifeboats >= number of passengers
    }
}

class Plane implements Vehicle {
    @Override
    public void safetyCheck() {
        //check if oxygen mask is in place.
    }
}

但很快就需要一种称为水上飞机的混合体,它可以重复对 ShipPlane 的安全检查

class SeaPlane implements Vehicle {
    @Override
    public void safetyCheck() {
        //check if oxygen mask is in place.
        // && 
       //check if number of lifeboats >= number of passengers
    }
}

哪些设计模式有助于在此类特定场景中减少代码冗余并使实现更简洁?

【问题讨论】:

  • 我将为PlaneShipSeaPlane 创建一个共同的祖先,使用参数化的safetyCheck,然后Plane 调用super,第一个值为param,Ship 调用super 具有另一个参数值,SeaPlane 调用两次,一个具有两个参数。 (可能使用枚举作为参数)
  • 同意这是重复的。 SeaPlane 在这个答案 stackoverflow.com/a/21824485/1168342 中基本上是 Pegasus

标签: java design-patterns


【解决方案1】:

如果不为此案例建立新的接口或类,您可以使用Composition over Inheritance 原则。

所以你的SeaPlane 可能看起来像这样:

class SeaPlane implements Vehicle {
    private Vehicle plane,
                    ship;
    @Override
    public void safetyCheck() {
       plane.safetyCheck();
       ship.safetyCheck()
    }
}

构造函数采用PlaneShip 对象。

【讨论】:

    【解决方案2】:

    您可以应用策略模式将组件的某些行为与组件定义分开。然后你可以在多个类中使用这些行为以避免冗余。

    【讨论】:

    • 我认为策略模式在这里不适用,因为您没有在运行时更改对象的类型。您只想减少冗余。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2017-02-11
    • 2023-04-08
    • 1970-01-01
    • 2011-01-09
    • 2019-07-04
    • 2018-06-03
    相关资源
    最近更新 更多