通过属性或类型识别对象

问题描述 投票:0回答:1

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

我有一个名为Bottle的类。现在,我有两种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()
        }
    }
oop design-patterns abstract-class
1个回答
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类表示违反单一责任原则,因为它处理多种瓶子。因此,如果您的应用由于某种特殊的瓶子而发生了一些变化,则整个代码都会受到影响。在许多情况下,这可能会令人沮丧。

© www.soinside.com 2019 - 2024. All rights reserved.