Обработчик определяет общую структуру объектов процессора. ‘HandleRequest’ здесь — это метод абстрактного процессора. Обработчик также имеет ссылку своего собственного типа, которая представляет следующий обработчик. Для этого должен быть определен публичный метод setNextHandler, и именно этот обработчик является абстрактным классом. ConcreteHandler определяет разные представления процессоров. Наконец, Клиент отвечает за создание необходимых обработчиков (процессоров) и определяет порядок цепочек между ними.
Обычно для этого шаблона могут существовать две разные реализации. Разница связана с «расположением бизнес-логики цепочки маршрутизации». Бизнес-логика цепной маршрутизации может быть либо в абстрактном классе Handler, либо в классах ConcreteHandler, либо в обоих. Пример первых двух подходов будет приведен ниже:
1. «Обработчик» имеет бизнес-логику цепной маршрутизации:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
public abstract class Processor { protected Processor next; protected int threshold; public void setNextProcessor(Processor p) { next = p; } public void process(String data, int value) { if (value <= threshold) { process(data); } if (next != null ) { next.message(data, threshold); } } abstract protected void processData(String data); } public class ProcessorA extends Processor { public ProcessorA ( int threshold) { this .threshold = threshold; } protected void processData(String data) { System.out.println( "Processing with A: " + data); } } public class ProcessorB extends Processor { public ProcessorB ( int threshold) { this .threshold = threshold; } protected void writeMessage(String data) { System.err.println( "Processing with B: " + data); } } public class Client { public static void main(String[] args) { Processor p, p1, p2; p1 = p = new ProcessorA( 2 ); p2 = new ProcessorB( 1 ); p1.setNextProcessor(p2); // Handled by ProcessorA p.process( "data1" , 2 ); // Handled by ProcessorA and ProcessorB p.process( "data2" , 1 ); } } |
2. У ConcreteHandler есть бизнес-логика цепной маршрутизации:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public abstract class Processor { protected Processor next; protected int threshold; public void setNextProcessor(Processor p) { next = p; } abstract protected void processData(String data); } public class ProcessorA extends Processor { public ProcessorA ( int threshold) { this .threshold = threshold; } protected void processData(String data, int value) { System.out.println( "Processing with A: " + data); if (value >= threshold && next != null ) { next.processData(data, value); } } } public class ProcessorB extends Processor { public ProcessorB ( int threshold) { this .threshold = threshold; } protected void processData(String data, int value) { System.out.println( "Processing with B: " + data); if (value >= threshold && next != null ) { next.processData(data, value); } } } public class Client { public static void main(String[] args) { Processor p, p1, p2; p1 = p = new ProcessorA( 2 ); p2 = new ProcessorB( 1 ); p1.setNextProcessor(p2); // Handled by ProcessorA p.processData( "data1" , 1 ); // Handled by ProcessorA and ProcessorB p.processData( "data2" , 2 ); } } |
Ссылка: 2 Реализация паттерна «Цепочка ответственности» с Java от нашего партнера JCG Кагдаса Басаранера в блоге CodeBuild .