Package edu . patterns . observer . observers . impl ; 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Package edu . patterns . observer . observers . impl ;



Import edu.patterns.observer.observers.Observer;

Import edu.patterns.observer.subjects.Subject;

public abstract class Observer {

protected Subject object;

public abstract void update();

}

Тут все довольно просто и нет необходимости пояснять.

Далее реализуем классы учителя и родителя соответственно.

 

public class Teacher extends Observer {

public Teacher(Subject object){

this.object = object;

this.object.attach(this);

}

@Override

public void update() {

System.out.println("Teacher is aware of your results:" + this.object.getState());

}

}

И класс родителей наблюдателей:

 

public class Parents extends Observer{

public Parents(Subject object){

this.object = object;

this.object.attach(this);

}

@Override

public void update() {

System.out.println("Parents are aware of your results:" + this.object.getState());

}

}

Классы Teacher и Parents практически одинаковы.

Тут стоит заметить, что экземпляр данного класса позволяет следить за 1 объектом и привязка осуществляется в конструкторе с помощью метода attach.

Когда ученик получит новую оценка учитель и родители непременно об этом узнают.

А теперь рассмотрим реализация самого субъекта.

 

public class Subject {

private List<Observer> observers = new ArrayList<Observer>();

private int state;

public int getState() {

return state;

}

public void setState(int state) {

this.state = state;

notifyAllObservers();

}

public void attach(Observer observer){

observers.add(observer);

}

private void notifyAllObservers(){

for (Observer observer: observers){

observer.update();

}

}

}

Объект наблюдения содержит список всех наблюдателей и в случае изменения состояния, все они будут оповещены.

Можно было бы написать код, который позволял бы удалять смотрителей, но мы просто рассмотрели саму идею.

Все основные класс записаны и теперь остается только это все запустить, класс ниже, позволит это сделать.

public class ObserverRunner {

public static void main(String args[]){

Subject pupil = new Subject();

new Parents(pupil);

new Teacher(pupil);

System.out.println("You've received new mark: 5");

pupil.setState(5);

}

}

Вы можете запустить данный пример и посмотреть, что любые полученные оценки у ученика не остаются без внимания.

Теперь, когда мы реализовали данный поведенческий паттерн сами, хочу сказать, что начиная с JDK 1.0 пакет java.utils имеет аналогичные классы и интерфейсы (Observer, Observable) для реализации данного поведения, подробнее о них можно почитать по ссылкам ниже:

https://docs.oracle.com/javase/7/docs/api/java/util/Observer.html

http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

Команда (Command)

Команда — поведенческий шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие.

Объект команды заключает в себе само действие и его параметры.

 

 

Описание паттерна Command

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

 

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

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

Команда – это объект, поэтому над ней допустимы любые операции, что и над объектом.

Интерфейс командного объекта определяется абстрактным базовым классом Command и в самом простом случае имеет единственный метод execute().

Производные классы определяют получателя запроса (указатель на объект получатель) и необходимую для выполнения операцию (метод этого объекта).

Метод execute() подклассов Command просто вызывает нужную операцию получателя.

В паттерне Command может быть до трех участников:

Клиент, создающий экземпляр командного объекта.

● Инициатор запроса, использующий командный объект.

● Получатель запроса.

Сначала клиент создает объект ConcreteCommand, конфигурируя его получателем запроса.

Этот объект также доступен инициатору.

Инициатор использует его при отправке запроса, вызывая метод execute().

Этот алгоритм напоминает работу функции обратного вызова в процедурном программировании

– функция регистрируется, чтобы быть вызванной позднее.

Паттерн Command отделяет объект, инициирующий операцию, от объекта, который знает, как ее выполнить.

Единственное, что должен знать инициатор, это как отправить команду.

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



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 41; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.23.101.60 (0.011 с.)