Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

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

//: innerclasses/control 1er/Event.java

// Общие для всякого управляющего события методы.

package innerclasses/controller;

public abstract class Event {

private long eventTime;

protected final long delayTime;

public Event(long delayTime) {

this.delayTime = delayTime; startO;

}

public void startO { //

Позволяет перезапуск eventTime = System nanoTimeO + delayTime;

}

public boolean readyО {

return System.nanoTimeO >= eventTime;

}

public abstract void actionO; } ///:-

Конструктор просто запоминает время (от момента создания объекта), через которое должно выполняться событие Event, и после этого вызывает метод start, который прибавляет к текущему времени интервал задержки, чтобы вычислить время возникновения события. Метод start отделен от конструктора, благодаря чему становится возможным «перезапуск» события после того, как его время уже истекло; таким образом, объект Event можно использовать многократно. Скажем, если вам понадобится повторяющееся событие, достаточно добавить вызов start в метод action.

Метод ready сообщает, что пора действовать — вызывать метод action. Конечно, метод ready может быть переопределен любым производным классом, если событие Event активизируется не по времени, а по иному условию.

Следующий файл описывает саму систему управления, которая распоряжается событиями и инициирует их. Объекты Event содержатся в контейнере List<Event>. На данный момент достаточно знать, что метод add присоединяет объект Event к концу контейнера с типом List, метод size возвращает количество элементов в контейнере, синтаксис foreach осуществляет последовательную выборку элементов List, а метод remove удаляет заданный элемент из контейнера:

//: innerclasses/control 1er/Control1er.java // Обобщенная система управления package innerclasses.controller; import java.util.*;

public class Controller {

// Класс из пакета java.util для хранения событий Event: private List<Event> eventList = new ArrayList<Event>; public void addEvent(Event c) { eventList.add(c): } public void run {

while(eventList.size > 0) {

for(Event e : new ArrayList<Event>(eventList)) if(e.readyO) {

System.out.println(e): e.actionO; eventList.remove(e):

}

}

} ///:-

Метод run в цикле перебирает копию eventList в поисках событий Event, готовых для выполнения. Для каждого найденного элемента он выводит информацию об объекте методом toString, вызывает метод action, а после этого удаляет событие из списка.

Заметьте, что в этой архитектуре совершенно неважно, что конкретно выполняет некое событие Event. В этом и состоит «изюминка» разработанной системы; она отделяет постоянную составляющую от изменяющейся. «Вектором изменения»

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

На этом этапе в дело вступают внутренние классы. Они позволяют добиться двух целей:

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

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

Рассмотрим конкретную реализацию системы управления, разработанную для управления функциями оранжереи16. Все события — включение света, воды и нагревателей, звонок и перезапуск системы — абсолютно разнородны. Однако система управления разработана так, что различия в коде легко изолируются. Внутренние классы помогают унаследовать несколько производных версий одного базового класса Event в пределах одного класса. Для каждого типа события от Event наследуется новый внутренний класс, и в его реализации action записывается управляющий код.

Как это обычно бывает при использовании каркасов приложений, класс GreenhouseControls наследует от класса Controller:

//: innerclasses/GreenhouseControls.java // Пример конкретного приложения на основе системы // управления, все находится в одном классе. Внутренние // классы дают возможность инкапсулировать различную // функциональность для каждого отдельного события, import innerclasses.control 1er.*,

public class GreenhouseControls extends Controller {

private boolean light = false,

public class LightOn extends Event {

public LightOndong delayTime) { super (delayTime). } public void actionO {

// Сюда помещается аппаратный вызов, выполняющий // физическое включение света, light = true;

}

public String toStringO { return "Свет включен"; }

}

public class LightOff extends Event {

public LightOffdong delayTime) { super(delayTime); } public void actionO {

// Сюда помещается аппаратный вызов, выполняющий // физическое выключение света light = false;

}

public String toStringO { return "Свет выключен", }

}

private boolean water = false;

public class WaterOn extends Event {

public WaterOn(long delayTime) { super(delayTime), } public void actionO {

// Здесь размещается код включения '// системы полива, water = true;

}

public String toStringO {

return "Полив включен";

}

}

public class WaterOff extends Event {

public WaterOffdong delayTime) { super(delayTime); } public void actionO {

Поделиться:
Популярные книги

Наследник чародея. Школяр. Книга первая

Рюмин Сергей
1. Наследник чародея
Фантастика:
городское фэнтези
5.00
рейтинг книги
Наследник чародея. Школяр. Книга первая

Проданная невеста

Wolf Lita
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Проданная невеста

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Черт из табакерки

Донцова Дарья
1. Виола Тараканова. В мире преступных страстей
Детективы:
иронические детективы
8.37
рейтинг книги
Черт из табакерки

Новый Рал 9

Северный Лис
9. Рал!
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Новый Рал 9

Росток

Ланцов Михаил Алексеевич
2. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
7.00
рейтинг книги
Росток

Пять попыток вспомнить правду

Муратова Ульяна
2. Проклятые луной
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Пять попыток вспомнить правду

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

Наследник с Меткой Охотника

Тарс Элиан
1. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник с Меткой Охотника

Хозяйка старой пасеки

Шнейдер Наталья
Фантастика:
попаданцы
фэнтези
7.50
рейтинг книги
Хозяйка старой пасеки

Выйду замуж за спасателя

Рам Янка
1. Спасатели
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Выйду замуж за спасателя

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Родословная. Том 2

Ткачев Андрей Юрьевич
2. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 2