Latest web development tutorials

паттерн наблюдатель

Когда существует множество отношений между объектами, использовать шаблон наблюдателя (наблюдатель Pattern). Например, когда объект изменяется, то он будет автоматически уведомлять его зависимые объекты. Паттерн наблюдатель принадлежит поведенческих моделей.

введение

Цель: определение зависимостей между объектами один-ко-многим, когда состояние объекта изменяется, все объекты , которые зависят от него уведомление и обновляется автоматически.

Главным образом решить: состояние уведомления об изменении объекта к проблемам других объектов, но и с учетом простоты использования и низкой муфты, обеспечивают высокую степень сотрудничества.

Когда использовать: объект (целевой объект) изменяет состояние, все зависимые объекты (объекты - наблюдатели) будут уведомлены, транслировать уведомления.

Как исправить: использование объектно-ориентированной технологии, эта зависимость может быть ослаблена.

Ключевой код: абстрактный класс есть ArrayList хранятся наблюдателей.

Примеры применения: 1, когда аукцион, аукционист наблюдать самую высокую цену, а затем уведомляют других участников ставка.2, Путешествие на Запад внутри Wukong просьбой о передаче Красный Мальчик Будда, Будда вода пролилась на пол старой черепахи провоцировать, эта черепаха является наблюдателем, он отметил, что действия Будды поливе.

Преимущества: 1, наблюдатель и наблюдаемый абстрактны связаны между собой .2, чтобы создать механизм запуска.

Недостатки: 1, если наблюдаемый объект имеет много прямых и косвенных наблюдателя, он уведомляет всех наблюдателей должны тратить много времени.2, если имеется циклическая зависимость между наблюдателем и наблюдаемой цели, наблюдать цель инициируют вызовы циркулировать между ними, может привести к сбою системы. 3, режим наблюдателя не существует никакого механизма, чтобы позволить зрителю знать, зритель то, как наблюдаемые изменения, но точно знаю, что цель наблюдения изменений.

Сценарии использования: 1, множественный общий метод подклассу, и та же самая логика.2, важные, сложные методы можно рассматривать как метод шаблона.

Примечание: 1, JAVA уже есть классы поддержки режима наблюдателя.2, чтобы избежать циклических ссылок. 3, если порядок исполнения, зритель может вызвать системные ошибки застрял, как правило, используют асинхронный режим.

реализация

Шаблон наблюдателя с использованием трех классов Subject, наблюдатель и клиента. В зависимости от объекта клиента с объектом и наблюдателем связан методы наблюдателя, привязанные Client Solutions от объектов. Мы создаемкласс Subject,Observer абстрактный класс и расширить абстрактный класснаблюдателякласса сущностей.

ObserverPatternDemo,наши демонстрационные классы с использованием объектов класса и организаций , являющихсяобъектомдля демонстрации шаблона наблюдателя.

Шаблон наблюдателя UML диаграмма

Шаг 1

Создание тематической категории.

Subject.java

импорт java.util.ArrayList;
импорт java.util.List;

Тема общественного класса {
	
   частный список <наблюдатель> наблюдатели 
      = New ArrayList <наблюдатель> ();
   частное INT состояние;

   общественное INT GetState () {
      возвращать состояние;
   }

   общественного недействительными SetState (целое состояние) {
      this.state = состояние;
      notifyAllObservers ();
   }

   общественного недействительными Attach (Наблюдатель Наблюдатель) {
      observers.add (наблюдатель);		
   }

   общественного недействительными notifyAllObservers () {
      для (наблюдатель от наблюдателя: наблюдатели) {
         observer.update ();
      }
   } 	
}

Шаг 2

Создать класс наблюдателя.

Observer.java

общественного абстрактного класса Observer {
   охраняемого объекта субъекта;
   публичное обновление абстрактной недействительными ();
}

Шаг 3

Создание наблюдателя класса сущностей.

BinaryObserver.java

Открытый класс BinaryObserver расширяет наблюдателя {

   общественного BinaryObserver (Тема субъект) {
      this.subject = субъект;
      this.subject.attach (это);
   }

   @Override
   общественного недействительными обновление () {
      System.out.println ( "двоичная строка:" 
      + Integer.toBinaryString (subject.getState ())); 
   }
}

OctalObserver.java

Открытый класс OctalObserver расширяет наблюдателя {

   общественного OctalObserver (Тема субъект) {
      this.subject = субъект;
      this.subject.attach (это);
   }

   @Override
   общественного недействительными обновление () {
     System.out.println ( "восьмиштырьковый Строка:" 
     + Integer.toOctalString (subject.getState ())); 
   }
}

HexaObserver.java

Открытый класс HexaObserver расширяет наблюдателя {

   общественного HexaObserver (Тема субъект) {
      this.subject = субъект;
      this.subject.attach (это);
   }

   @Override
   общественного недействительными обновление () {
      System.out.println ( "Hex строка:" 
      + Integer.toHexString (subject.getState ()) .toUpperCase ()); 
   }
}

Шаг 4

Используйтесубъекти наблюдатель экземпляры объектов.

ObserverPatternDemo.java

Открытый класс ObserverPatternDemo {
   государственной статической силы основных (String []) {агдз
      Тематический = новый Предмет ();

      новый HexaObserver (субъект);
      новый OctalObserver (субъект);
      новый BinaryObserver (субъект);

      System.out.println ( "Первое изменение состояния: 15");	
      subject.setState (15);
      System.out.println ( "Второе изменение состояния: 10");	
      subject.setState (10);
   }
}

Шаг 5

Проверьте выход.

Во-первых изменение состояния: 15
Hex Строка: F
Восьмиштырьковый Строка: 17
Двоичная строка: 1111
Второе изменение состояния: 10
Шестнадцатеричная строка: A
Восьмиштырьковый Строка: 12
Двоичная строка: 1010