Определить объект по свойству или типу - PullRequest
0 голосов
/ 29 мая 2020

У меня есть вопрос относительно шаблона проектирования в java.

У меня есть класс с именем Bottle. Теперь у меня есть два типа Bottle: стекло bottle и металл bottle.

Какой из следующих шаблонов проектирования мне следует использовать: 1. Установите тип bottle как его свойство

    class Bottle {
        public enum BottleType { GLASS, METAL }

        BottleType type;
    }
Использовать наследование
    abstract class Bottle {
    }

    class GlassBottle extends Bottle {
    }

    class MetalBotle extends Bottle {
    }

Обновить мой вопрос 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()
        }
    }

1 Ответ

0 голосов
/ 12 июня 2020

Хотя трудно ответить, так как дальнейших планов нет, второй вариант обычно лучше. Но давайте назовем это полиморфизмом вместо наследования, потому что вы можете добиться преимущества этого параметра не только с помощью ключевого слова 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 в первом варианте является индикатором нарушения принципа единой ответственности, поскольку он работает с разными видами бутылок. Итак, если ваше приложение немного изменится из-за определенного типа bottle, это повлияет на весь код. Во многих случаях это может расстроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...