Статьи

Шаблон цепочки ответственности в Java

Шаблон проектирования «Цепочка ответственности» необходим, когда для выполнения операции должно существовать несколько процессоров, и для этих процессоров должен быть определен определенный порядок. Также важна изменчивость порядка процессоров во время выполнения. Представление шаблона в форматеML выглядит следующим образом:

Обработчик определяет общую структуру объектов процессора. ‘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 .