Цепочка ответственности: цепочка ответственности (COR) - это серия классов, которые пытаются обработать запрос. Другими словами, когда приходит запрос, в первую очередь он обрабатывает процесс класса А.
Как использовать модель цепочки ответственности
Хотя этот абзац использует COR, он также демонстрирует, что такое COR.
Есть интерфейс обработчика:
Кода -копия выглядит следующим образом:
обработчик публичного интерфейса {
public void handleRequest ();
}
Это пример обработки запросов.
◆ Первое решение, которое приходит на ум: добавить несколько запросов в интерфейс:
Кода -копия выглядит следующим образом:
обработчик публичного интерфейса {
public void handlehelp ();
public void handleprint ();
public void harderformat ();
}
В частности, это код для реализации интерфейса:
Кода -копия выглядит следующим образом:
публичный класс ConcreteHandler реализует обработчик {
частный преемник обработчика;
Public ConcreteHandler (преемник обработчика) {
this.successor = преемник;
}
public void handlehelp () {
// конкретный код для обработки запроса справки ...
}
public void handleprint () {
// Если это печать, обратитесь к обработке печати
преемник. handleprint ();
}
public void harderformat () {
// Если это формат, перейдите в формат процесса
преемник. handleformat ();
}
}
Существует три таких конкретных классов реализации, выше, которые обрабатывают помощь, а также обработка печати и формата обработки, которые, вероятно, являются нашими наиболее часто используемыми идеями программирования.
Хотя идея проста и ясна, есть проблема с расширением.
◆ Второе решение: переверните каждый запрос в интерфейс, чтобы у нас был следующий код:
Кода -копия выглядит следующим образом:
Общественный интерфейс helphandler {
public void handlehelp ();
}
публичный интерфейс Printhandler {
public void handleprint ();
}
публичный интерфейс Formathandler {
public void harderformat ();
}
общественный класс ConcreteHandler
реализует helphandler, printhandler, formathandlet {
Частный Helphandler помогает;
Частный принцип Принтандлер;
Частный формат -формат -форматлеров;
Public ConcreteHandler (Helphandler Helpuccessor, Printhandler Primtscorsor, Formathandler Formatsuccessor)
{
this.helpsuccessor = помогает;
this.printsuccessor = printsuccessor;
this.formatsuccessor = formatsuccessor;
}
public void handlehelp () {
.........
}
public void handleprint () {this.printsuccessor = printsuccessor;}
public void harderformat () {this.formatsuccessor = formatsuccessor;}
}
При добавлении нового запроса запроса этот метод сохраняет только объем модификации интерфейса, и реализация интерфейса ConcreteHandler также необходимо изменить. И код, очевидно, не прост и красив.
◆ Решение 3: В интерфейсе обработчика используется только один метод параметризации:
Кода -копия выглядит следующим образом:
обработчик публичного интерфейса {
public void handleRequest (String запрос);
}
Тогда код реализации обработчика следующим образом:
публичный класс ConcreteHandler реализует обработчик {
частный преемник обработчика;
Public ConcreteHandler (преемник обработчика) {
this.successor = преемник;
}
public void handleRequest (string request) {
if (request.equals ("help")) {
// Вот конкретный код для обработки справки} Источее
// Переход к следующему преемнику.handle (запрос);
}
}
}
Что сначала предположим, что запрос типа строки. Конечно, мы можем создать специальный запрос класса
◆ Окончательное решение: код обработчика интерфейса выглядит следующим образом:
Кода -копия выглядит следующим образом:
обработчик публичного интерфейса {
public void handleRequest (запрос на запрос);
}
Определение класса запроса:
Запрос открытого класса {
частная строка типа;
public Request (String Type) {this.type = type;}
public String getType () {return Type;}
public void execute () {
// Реальный конкретный код поведения запроса}
}
Тогда код реализации обработчика следующим образом:
Кода -копия выглядит следующим образом:
публичный класс ConcreteHandler реализует обработчик {
частный преемник обработчика;
Public ConcreteHandler (преемник обработчика) {
this.successor = преемник;
}
public void handleRequest (запрос запроса) {
if (запрос exantef helprequest) {
// Вот конкретный код для обработки справки} else if (запрос exanceof printrequest) {
request.execute ();
}еще
// Переход к следующему преемнику.handle (запрос);
}
}
}
Это решение - COR.
1. Преимущества COR: Поскольку невозможно предсказать, какой тип запросов принадлежит внешнему миру, если каждый класс сталкивается с запросом, который он не может обрабатывать, просто сдавайся. Это, несомненно, уменьшает связь между классами.
2. Недостатком COR является его неэффективность, поскольку завершение запроса может быть пройдене до конца, прежде чем он может быть завершен. В Java AWT1.0 обработка кнопок мыши состоит в том, чтобы использовать COR.
Масштабируемость плохая, потому что в COR должен быть унифицированный обработчик интерфейса.