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.

pkg8patterns/patterns13ChainOfResponsibilityPattern.java
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}