23 Образец дизайна Глава 16:
Определение: инкапсулирует определенные операции, которые действуют на каждый элемент в определенную структуру данных. Он может определить новые операции, которые действуют на эти элементы, не изменяя структуру данных.
Тип: поведенческий паттерн
Классовая диаграмма:
Режим для посетителей может быть самым сложным режимом среди поведенческих режимов, но это не может быть причиной, по которой мы не овладеть его.
Давайте сначала рассмотрим простой пример, код следующим образом
класс A {public void method1 () {System.out.println ("I Am A"); } public void method2 (b b) {b.showa (this); }} класс B {public void showa (a a) {a.method1 (); }}Давайте в основном посмотрим, в чем разница между методом Method1 и Method Method2 в классе A. Метод метода1 очень прост, просто распечатайте предложение «Я - А»; Метод метода2 немного сложнее, используйте класс B в качестве параметра и вызовите метод Showa класса B.
Давайте посмотрим на метод класса Showa B. Метод Showa использует класс A в качестве параметра, а затем вызывает метод Method1 Class A. Вы можете увидеть, что метод Method2 просто вызывает свой собственный метод. Его результатом также должен быть «Я - А». После анализа давайте запустим эти два метода и увидим результат запуска:
открытый тест класса {public static void main (string [] args) {a a = new a (); a.method1 (); a.method2 (new b ()); }}Результат работы:
Я
Я
После понимания этого примера вы поймете 90% модели посетителей. В примере для класса A класс B является посетителем. Тем не менее, этот пример не весь режим посетителя. Хотя это интуитивно понятно, он имеет плохую масштабируемость. Давайте поговорим об общей реализации режима для посетителей. Вы можете увидеть с помощью классовой диаграммы, что в режиме посетителей в основном включены следующие роли:
Аннотация посетителя: абстрактный класс или интерфейс, который заявляет, какие элементы могут получить доступ. В частности, в программе параметры в методе посещения определяют, к каким объектам можно получить доступ.
Посетитель: Реализуйте метод, объявленный абстрактными посетителями, который влияет на то, что должны делать посетители и что они должны делать после доступа к классу.
Класс абстрактных элементов: интерфейс или абстрактный класс, который объявляет, какой тип доступа посетителей принимается. Программа определяется с помощью параметров в методе принятия. Как правило, существует два типа методов абстрактных элементов, один из них является его собственной бизнес -логикой, а другой - каким типам посетителей разрешается получить доступ.
Класс элементов: реализует метод принятия, объявленный классом абстрактного элемента, обычно посетителя. Visit (это), и в основном сформировал фиксированную формулу.
Структурный объект: Контейнер элемента обычно содержит контейнер, который размещает несколько различных классов и интерфейсов, таких как список, набор, карта и т. Д. Эта роль редко абстрагирует в проекте.
Общий код реализация режима посетителей
Аннотация Элемент класса {public rastic voidce (посетители Ivisitor); Общественная абстрактная void dosomething (); } интерфейс ivisitor {public void визит (ConceteElement1 EL1); Общественное визит (Concretelement2 EL2); } class concretelement1 Extends element {public void dosomething () {System.out.println ("Это элемент 1"); } public void Accept (Ivisitor Visitor) {visitor.visit (this); }} class concretelement2 Extends element {public void dosomething () {System.out.println ("Это элемент 2"); } public void Accept (Ivisitor Visitor) {visitor.visit (this); }} класс Посетитель реализует IVISITOR {public void визит (ConceteElement1 el1) {el1.dosomething (); } public void визит (ConceteElement2 el2) {el2.dosomething (); }} class objectstruture {public Static List <element> getList () {list <element> list = new ArrayList <element> (); Случайный ran = new Random (); for (int i = 0; i <10; i ++) {int a = ran.nextint (100); if (a> 50) {list.add (new concretelement1 ()); } else {list.add (new ConceteElement2 ()); }} return List; / для (элемент e: list) {e.accept (new Visitor ()); }}} Преимущества режима посетителей
Соответствует принципу единой ответственности: в любом сценарии, когда режим посетителя применим, операции, которые необходимо инкапсулировать в посетителе в классе элементов, должны быть операциями, которые имеют мало общего с самим классом элемента и являются изменчивыми. С одной стороны, использование режима посетителя соответствует принципу единой ответственности, а с другой стороны, поскольку инкапсулированные операции обычно изменчивы, когда происходят изменения, расширение изменяющейся части может быть достигнуто без изменения самого класса элементов.
Хорошая масштабируемость: классы элементов могут расширять различные операции, принимая разных посетителей.
Применимые сценарии для режима посетителей
Если в объекте есть некоторые операции, которые не связаны с объектом (или слабо связаны), и чтобы избежать этих операций, загрязняющих объект, вы можете использовать режим посетителя, чтобы инкапсулировать эти операции в посетителя.
Если в группе объектов есть аналогичные операции, чтобы избежать большого количества дублированного кода, эти дубликаты также могут быть инкапсулированы в посетителя.
Тем не менее, режим для посетителей не такой идеальный, и он также имеет роковые недостатки: добавление новых классов элементов сложнее. Через код шаблона посетителя мы видим, что в классе посетителей каждый класс элементов имеет соответствующий метод обработки. То есть каждый класс элементов должен быть добавлен для изменения класса для посетителей (также включая подкласс или класс реализации класса для посетителей), что является довольно неприятным для изменения. То есть, когда количество классов элементов неясно, режим посетителя следует использовать с осторожностью. Следовательно, режим посетителя более подходит для рефакторирования существующих функций. Например, если были определены основные функции проекта, данные классов элементов были в основном определены и не будут изменяться. Все, что изменится, это соответствующие операции в этих элементах. В настоящее время мы можем использовать режим посетителя для рефакторирования исходного кода, чтобы исходные функции могли быть изменены без изменения каждого класса элементов.
Суммировать
Как GOF, автор книги «Образец проектирования», описывает режим посетителя: в большинстве случаев вам необходимо использовать режим посетителя, но как только он вам понадобится, он действительно нуждается в нем. Конечно, это только для настоящих больших парней. В действительности (по крайней мере, в окружающей среде, в которой я нахожусь), многие люди часто зависимы от моделей дизайна. При использовании шаблона дизайна они никогда не рассматривают, подходит ли образец, который они используют, подходит для этого сценария, но часто просто хотят показать свою способность управлять объектно-ориентированным дизайном. Если у вас есть этот менталитет при программировании, вы часто злоупотребляете шаблоном дизайна. Поэтому при обучении шаблонов дизайна вы должны понимать применимость шаблонов. Необходимо использовать шаблон, потому что вы понимаете его преимущества, а не использовать шаблон, потому что вы понимаете его недостатки; Вместо того, чтобы использовать шаблон, потому что вы не понимаете его недостатков, а не для использования шаблона, потому что вы не понимаете его преимуществ.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.