通过属性或类型识别对象

时间:2020-05-29 02:44:56

标签: oop design-patterns abstract-class

我对Java中的设计模式有疑问。

我有一个名为 Bottle 的类。 现在,我有两种瓶子:玻璃瓶和金属瓶。

我应使用以下哪些设计模式: 1.将瓶子的类型设置为其属性

                       Quantity
Year    Week    Client  
2012     1       Coke      200
                 Pepsi     100
                 7UP       400
         2       Coke      500
                 Pepsi     750
                 7UP       200
         3       Coke      120
                 Pepsi     100
                 7UP       050
... ... ... ...
2020    22       Coke      100 
             Mountain Dew  650
                Fanta      110
        23       7UP       100 
                 Pepsi     199
                 Coke      200
... ... ... ...

  1. 使用继承
    class Bottle {
        public enum BottleType { GLASS, METAL }

        BottleType type;
    }

更新我的问题 瓶子将由名为BottleProcessor的处理器处理

    abstract class Bottle {
    }

    class GlassBottle extends Bottle {
    }

    class MetalBotle extends Bottle {
    }

1 个答案:

答案 0 :(得分:0)

尽管没有进一步的计划很难回答,但是第二种选择通常更好。但是,我们称它为多态而不是继承,因为不仅可以使用extends关键字,还可以通过implements关键字来获得此选项的优点。

这样的代码:

interface Bottle {
    void doBreak();
}

class GlassBottle implements Bottle {
    public void doBreak() { ... }
}

class MetalBottle implements Bottle {
    public void doBreak() { ... }
}

class BottleProcessor {
    public static breakBottle(Bottle _bottle) {
        // here I don't know don't care about detailed things like Glass or Metal
        // I just call:
        _bottle.doBreak();
    }
}

这种设计的好处是不会像第一个选项那样出现大/神类。第一个选项中的Bottle类表示违反单一责任原则,因为它处理多种瓶子。因此,如果您的应用由于某种特殊的瓶子而有所变化,则整个代码都会受到影响。在许多情况下,这可能会令人沮丧。