【问题标题】:Identify an Object by property or type按属性或类型识别对象
【发布时间】:2020-09-16 13:03:58
【问题描述】:

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

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

我应该使用以下哪种设计模式: 1. 设置瓶子的类型作为它的属性

    class Bottle {
        public enum BottleType { GLASS, METAL }

        BottleType type;
    }
  1. 使用继承
    abstract class Bottle {
    }

    class GlassBottle extends Bottle {
    }

    class MetalBotle extends Bottle {
    }

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

    class BottleProcessor {
        public static breakBottle(Bottle _bottle) {
            //TODO: break bottle
            if _bottle is glass bottle 
                breakGlassBottle()
            else if _bottle is metal bottle 
                breakMetalBottle()
        }
    }

【问题讨论】:

  • 无法回答。这取决于您进一步计划如何处理这些对象。在没有任何实现的情况下,枚举是显而易见的选择。
  • 使用继承是Java的方式。您可以使用 getClass().getSimpleName() 或类似的方法从实例中获取特定的类名。
  • @AdrianM。我非常不同意。有效的 Java #16:“优先组合优于继承”
  • 将一种瓶型组合到另一种瓶型中?什么?
  • 将瓶子的类型组合成瓶子。在没有实现的情况下,继承在这里带来了零好处,并引入了两个额外的类。

标签: oop design-patterns abstract-class


【解决方案1】:

虽然由于没有进一步的计划很难回答,但第二种选择通常更好。但是让我们将其称为多态而不是继承,因为您不仅可以通过 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 类是违反单一责任原则的指标,因为它处理多种瓶子。所以,如果你的应用由于某种特定的瓶子而发生了一点变化,整个代码都会受到影响。在许多情况下,这可能会令人沮丧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多