Design patterns
patterns13ChainOfResponsibilityPattern
- Path
- pkg8patterns/patterns13ChainOfResponsibilityPattern.java
- Package
- pkg8patterns
- Study order
- 13
- Run
- Single-file source launch
- Command
- java pkg8patterns/patterns13ChainOfResponsibilityPattern.java
There is no in-browser runner. This is the file from the curriculum, unchanged.
1package pkg8patterns;2 3/*4 * Chain of Responsibility (Behavioral)5 * ------------------------------------6 * INTENT: pass a request along a chain of handlers; each decides to handle it or7 * forward it. Decouples sender from receiver.8 * UML: Handler + setNext() + handle() ; concrete handlers form a linked chain.9 * PROS: flexible ordering; single responsibility per handler.10 * CONS: request may go unhandled; harder to debug flow.11 * REAL-WORLD: servlet filters, logging levels, exception handling, middleware.12 */13public class patterns13ChainOfResponsibilityPattern {14 15 static abstract class Approver {16 protected Approver next;17 Approver setNext(Approver next) { this.next = next; return next; }18 void handle(double amount) {19 if (canApprove(amount)) System.out.println(name() + " approved $" + amount);20 else if (next != null) next.handle(amount);21 else System.out.println("No one could approve $" + amount);22 }23 abstract boolean canApprove(double amount);24 abstract String name();25 }26 27 static class TeamLead extends Approver {28 boolean canApprove(double a) { return a <= 1_000; }29 String name() { return "TeamLead"; }30 }31 static class Manager extends Approver {32 boolean canApprove(double a) { return a <= 10_000; }33 String name() { return "Manager"; }34 }35 static class Director extends Approver {36 boolean canApprove(double a) { return a <= 100_000; }37 String name() { return "Director"; }38 }39 40 public static void main(String[] args) {41 Approver chain = new TeamLead();42 chain.setNext(new Manager()).setNext(new Director());43 44 for (double amt : new double[]{500, 5_000, 50_000, 500_000}) chain.handle(amt);45 }46}