Chain-of-responsibility Pattern - Another Example

Another Example

Below is another example of this pattern in Java. In this example we have different roles, each having a fixed purchasing limit and a successor. Every time a user in a role receives a purchase request that exceeds his or her limit, the request is passed to his or her successor.

The PurchasePower abstract class with the abstract method processRequest.

abstract class PurchasePower { protected final double base = 500; protected PurchasePower successor; public void setSuccessor(PurchasePower successor) { this.successor = successor; } abstract public void processRequest(PurchaseRequest request); }


Four implementations of the abstract class above: Manager, Director, Vice President, President

class ManagerPPower extends PurchasePower { private final double ALLOWABLE = 10 * base; public void processRequest(PurchaseRequest request) { if (request.getAmount < ALLOWABLE) { System.out.println("Manager will approve $" + request.getAmount); } else if (successor != null) { successor.processRequest(request); } } } class DirectorPPower extends PurchasePower { private final double ALLOWABLE = 20 * base; public void processRequest(PurchaseRequest request) { if (request.getAmount < ALLOWABLE) { System.out.println("Director will approve $" + request.getAmount); } else if (successor != null) { successor.processRequest(request); } } } class VicePresidentPPower extends PurchasePower { private final double ALLOWABLE = 40 * base; public void processRequest(PurchaseRequest request) { if (request.getAmount < ALLOWABLE) { System.out.println("Vice President will approve $" + request.getAmount); } else if (successor != null) { successor.processRequest(request); } } } class PresidentPPower extends PurchasePower { private final double ALLOWABLE = 60 * base; public void processRequest(PurchaseRequest request) { if (request.getAmount < ALLOWABLE) { System.out.println("President will approve $" + request.getAmount); } else { System.out.println( "Your request for $" + request.getAmount + " needs a board meeting!"); } } }


The following code defines the PurchaseRequest class that keeps the request data in this example.

class PurchaseRequest { private int number; private double amount; private String purpose; public PurchaseRequest(int number, double amount, String purpose) { this.number = number; this.amount = amount; this.purpose = purpose; } public double getAmount { return amount; } public void setAmount(double amt) { amount = amt; } public String getPurpose { return purpose; } public void setPurpose(String reason) { purpose = reason; } public int getNumber{ return number; } public void setNumber(int num) { number = num; } }


In the following usage example, the successors are set as follows: Manager -> Director -> Vice President -> President

class CheckAuthority { public static void main(String args) { ManagerPPower manager = new ManagerPPower; DirectorPPower director = new DirectorPPower; VicePresidentPPower vp = new VicePresidentPPower; PresidentPPower president = new PresidentPPower; manager.setSuccessor(director); director.setSuccessor(vp); vp.setSuccessor(president); // Press Ctrl+C to end. try { while (true) { System.out.println("Enter the amount to check who should approve your expenditure."); System.out.print(">"); double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine); manager.processRequest(new PurchaseRequest(0, d, "General")); } } catch(Exception e) { System.exit(1); } } }

Read more about this topic:  Chain-of-responsibility Pattern

Famous quotes containing the word example:

    Our intellect is not the most subtle, the most powerful, the most appropriate, instrument for revealing the truth. It is life that, little by little, example by example, permits us to see that what is most important to our heart, or to our mind, is learned not by reasoning but through other agencies. Then it is that the intellect, observing their superiority, abdicates its control to them upon reasoned grounds and agrees to become their collaborator and lackey.
    Marcel Proust (1871–1922)