В этой статье описывается использование режима цепочки ответственности для студентов, чтобы уйти. Поделитесь этим для вашей ссылки, следующим образом:
1. Определение шаблона
В модели цепочки ответственности многие объекты связаны ссылками на свой следующий дом каждым объектом, образуя цепочку. Запрос клиентского приложения передается в этой цепочке до тех пор, пока объект в цепочке не решит обработать запрос. Клиент, выполняющий этот запрос, не знает, какой объект в цепочке в конечном итоге обрабатывает запрос, который позволяет системе динамически реорганизовать цепочку и назначать обязанности, не влияя на клиента.
(1) Роль абстрактного процессора: определить интерфейс для обработки запросов. При необходимости интерфейс может определить метод для установки и возврата ссылки на следующий дом. Эта роль обычно реализуется с помощью класса Java Abstract или Java Interface.
(2) Конкретная роль обработки: после получения запроса конкретный процессор может выбрать обработку запроса или передать запрос следующему дому.
2. Примеры модели
1 Анализ шаблона
Мы заимствуем отпуск студентов, чтобы проиллюстрировать эту модель
2 Статическая классовая диаграмма цепочки ответственности
3 примеры кода
3.1 INTERCEANT Студенческого интерфейса
Пакет com.demo.chain.message;/** * Интерфейс студентов * * @author * */public interface Istudent {/** * Получить статус состояния студента * * 0: Маленькие вещи (монитор класса может справиться с этим) * * 1: Монитор класса не может справиться с вещами, с которыми учитель может обрабатывать * * 2: Учитель не может справиться с вещами, с которыми принципал может обрабатывать * * * * * */ */ */ */ * * * / ** * Получите сообщение об отпуске студента * * @return */ public String getRequestMessage ();}3.2 Студенты осознают студента
пакет com.demo.chain.message;/** * Класс реализации студентов * * @author * */public Class Студент реализует ustudent {// размер условия частного состояния int = -1; // Прощальное сообщение частное сообщение о окончательной строке; Общественный студент (int state, строковое сообщение) {this.state = state; this.message = сообщение; } / ** * Получить статус ухода ученика * * 0: Маленькие вещи (монитор класса может обрабатывать) * * 1: Монитор класса не может справиться с вещами, с которыми учитель может обрабатывать * * * 2: Учитель не может справиться с вещами, с которыми принципал может обрабатывать * * * * / public int getState () {return.State; } / ** * Получить Студент Оставить сообщение * * @return * / public String getRequestMessage () {return this.message; }}3.3 Аннотация Интерфейс обработки-Ihandler
пакет com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Аннотация интерфейс процессора * * @author * */public interface ihandler {// Запросить процесс public void handleRequest (Istudent студент); // Установить следующий обработчик Public void Sethandler (обработчик Ihandler);}3.4 AbstracThandler
пакет com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Аннотация Хэндлер * * @author * */public абстрактный класс AbstracThandler реализует ihandler {// next handler private ihandler Handler; // оставлять уровень частного состояния int = -1; // Установка конструктора Public AbstracThandler (int state) {this.state = state; } // Обработка запросов к подклассу для обработки конкретной обработки публичного абстрактного процесса void (Istudent Student); // Обработка запросов public void handleRequest (istudent student) {// Если объект студента существует, если (студент! = Null) {if (this.state == student.getState ()) {// Если уровень отпуска соответствует текущему, текущий объект будет обработан This.Process (студент); } else {if (this.handler! = null) {System.out.println ("Запросите высшего лидера ответить!"); // Если текущий объект не может быть обработан, он будет передан следующему процессору для обработки этого. Handler.handleRequest (студент); }}}}} // Установить следующий процессор Public void Sethandler (Ihandler Handler) {this.handler = Handler; }}3.5 Squad Leaderhandler
пакет com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Аннотация Хэндлер * * @author * */public абстрактный класс AbstracThandler реализует ihandler {// next handler private ihandler Handler; // оставлять уровень частного состояния int = -1; // Установка конструктора Public AbstracThandler (int state) {this.state = state; } // Обработка запросов к подклассу для обработки конкретной обработки публичного абстрактного процесса void (Istudent Student); // Обработка запросов public void handleRequest (istudent student) {// Если объект студента существует, если (студент! = Null) {if (this.state == student.getState ()) {// Если уровень отпуска соответствует текущему, текущий объект будет обработан This.Process (студент); } else {if (this.handler! = null) {System.out.println ("Запросите высшего лидера ответить!"); // Если текущий объект не может быть обработан, он будет передан следующему процессору для обработки этого. Handler.handleRequest (студент); }}}}} // Установить следующий процессор Public void Sethandler (Ihandler Handler) {this.handler = Handler; }}3.6 Учитель-учитель
Пакет com.demo.chain.impl; import com.demo.chain.handle.abstracthandler; import com.demo.chain.message.istudent;/** * Учительский обработчик * * @author * */public Class учительдлер расширяет extracthandler {public учительндлер () {super (1); } // Специфический запрос на обработку подкласса @Override public void Process (Istudent Student) {System.out.println ("Ответ учителя:" + student.getRequestmessage ()); }}3.7 Принципал-школьник
Пакет com.demo.chain.impl; import com.demo.chain.handle.abstracthandler; import com.demo.chain.message.istudent;/** * Принципальный обработчик * * @author * */public Class SchoolmasterHandler расширяет AbstracThandler {public Schoolmandler () {Super (2); } // Специфический запрос на обработку подкласса @Override public void Process (Istudent Student) {System.out.println ("Ответ принципала:" + student.getRequestmessage ()); }}3.8 Внешний вид 1 -го класса.
пакет com.demo.chain.process; import com.demo.chain.handle.ihandler; import com.demo.chain.impl.schoolmasterhandler; импорт com.demo.chain.impl.squadleaderhandler; импорт com.demo.chain.impl.teacherhandler; Ассоциация цепи * * @author * */public Class ProcessHandler {// Класс лидер Хэндлер Частный финал Ihandler Sqmshandler; // Учитель Хэндлер Частный финал Ihandler Techhandler; // Принципальный личный финал Ihandler Scmshandler; // singleton mode private static processhandler processhandler = new ProcessHandler (); / *** Метод конструктора для создания цепочки ответственности для обработки ухода*/ private ProcessHandler () {// Создать объект обработки // лидер класса THE.SQMSHANDLER = NEW SQUADLEADERHandler (); // учитель this.techhandler = new weamsionhandler (); // Принципал this.scmshandler = new SchoolmasterHandler (); / *** Установить цепочку ответственности*/ // Установить следующего обработчика лидера класса: учитель this.sqmshandler.sethandler (this.techhandler); // Установить следующего обработчика учителя: директор this.techhandler.sethandler (this.scmshandler); } / ** * Получить экземпляр объекта Singleton * * @return * / public static processhandler getInstance () {return ProcessHandler; } / ** * Отправить запрос на отпуск * * @param Сообщение * / public void sendmessage (Istudent Student) {// Отправить в первый обработчик: лидер класса обрабатывает это.sqmshandler.handleRequest (студент); }}3.9 Клиент-клиент
Пакет com.demo; import java.util.random; import com.demo.chain.message.istudent; import com.demo.chain.message.student; импорт com.demo.chain.process.processhandler;/** * Главное приложение * * @author * */public class {/** * @param * aspaid args) {// Получить объект внешнего объекта ProcessHandler ProcessHandler = processHandler.getInstance (); // Создать объект случайного числа для случайного генерирования объекта студента random random = new random (); for (int i = 0; i <3; i ++) {// Получить случайное число int radom = random.nextint (3); Istudent Student = новый студент (Radom, «Студент» + I + «Я болен, я хочу уйти!»); System.out.println("##################################################################################### Норр. Норр. #######################################################################################################"); // обработать сообщение Processhandler.sendmessage (студент); System.out.println("#############################################/n"); }}}4 Результаты работы
####################################################################################################### вместе
Запросите ответ от высшего лидера!
Запросите ответ от высшего лидера!
Ответ директора: Студент 0 болен и хочет уйти!
####################################################################################################### вместе
####################################################################################################### вместе
Запросите ответ от высшего лидера!
Запросите ответ от высшего лидера!
Ответ директора: Студент 1 болен и хочет уйти!
####################################################################################################### вместе
####################################################################################################### вместе
Утвержденный монитор класса: Студент 2 болен и хочет уйти!
####################################################################################################### вместе
Iii. Принципы дизайна этого образца
1 Принцип «открытый»
2 Принцип единой ответственности
4. Используйте случаи
(1) Существует несколько объектов, которые обрабатывают один и тот же запрос. Все еще неясно, какой из них используется для его обработки. Это определяется только во время выполнения, который объект обрабатывает его.
(2) Сообщение имеет несколько получателей, а приемный объект неясен. Вам нужно только отправить сообщение одному из объектов и обработать его внутри.
(3) Несколько объектов обработки одного и того же сообщения могут увеличиваться или уменьшаться динамически, и должны быть указаны динамически.
5. Статическая классовая диаграмма цепочки ответственности
Для получения дополнительного контента, связанного с Java, читатели, заинтересованные в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Operation Dom Узел», «Краткое изложение Java File и Directory Commine» и «Советы по эксплуатации Java Cache»
Я надеюсь, что эта статья будет полезна для всех Java Programming.