Проектирование паттернов
Привет, друзья!
По рекомендациям форумчан начал читать параллельно про паттерны. Вчера несколько раз перечитал страниц двадцать, не могу понять.
В книге даётся один из принципов проектирования, когда нужно выделить то, что изменяется, инкапсулировать, чтобы оно не влияло на работу остального кода.
Далее, приводиться картинка, на которой нужно отобразить (карандашом), отношение между классами:
s018.radikal.ru/.../1202/c9/1af1d7f6cf1d.png
Мне стало не понятным, что значить инкапсулированы? Раньше, я думал, что инкапсуляция связана тесно с реализацией класса. Т.е. моя задача максимально защитить данные, скрыть реализацию от программиста-клиента и, оставить для него только интерфейс.
В классе Duck объявлены два члена класса, поля:
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
у которых модификатор доступа — в пределах пакета. Соответственно, они не инкапсулированы. В моём понимании инкапсулировать, если две переменные объявить с модификатором protected, чтобы они были доступны исключительно для потомков и скрыты от внешнего мира.
Что имеется ввиду инкапсуляция fly и quack в книге, не могу никак «въехать». Интерфейс это высшая степень абстракции, которая не несёт в себе реализации кода. Интерфейс нельзя инкапсулировать и, в нём тоже ничего не инкапсулируешь.
И второй вопрос, почему у потомков отношение классов только «является» судя по этой таблице, если в действительности, они несут в себе ещё композицию? Так как в конструкторе классов MallardDuck, RubberDuck, RedheadDuck, RecoyDuck будут инициализированы переменные поведения уток:
MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
код уток выкладываю:
github.com/...ter/src/Patterns/SimUDuck
P.S. Вообще, у меня ещё один вопрос по Java. Когда проходил тестирование в SoftServe был задан вопрос, возможна ли инкапсуляция без классов. Я понимаю, что инкапсуляция без классов невозможна?
Большое спасибо за ответы! :)
36 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів