Changes

Jump to: navigation, search

Chain of Responsibility

7,104 bytes added, 21:58, 2 April 2007
no edit summary
*'''Broken Chain'''
**Sometimes we could forget to include in the implementation of the handleRequest method the call to the successor, causing a break in the chain. The request isn’t sent forward from the broken link and so it ends up unhandled.
 
----
**If it can handle the request it does so, otherwise it sends the request to its successor
* '''Client''' - sends commands to the first object in the chain that may handle the command
 
----
== Code Examples ==
 
----
 
=== Java Example ===
'''Example 1''' -- This code can be found at [http://www.javacamp.org/designPattern/chains.html www.Javacamp.org]
<pre>
import java.io.*;
 
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);
 
}
 
 
class Manager 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 Director 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 VicePresident 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 President 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!");
}
}
 
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;
}
}
 
class CheckAuthority {
public static void main(String[] args) throws Exception{
Manager manager = new Manager();
Director director = new Director();
VicePresident vp = new VicePresident();
President president = new President();
manager.setSuccessor(director);
director.setSuccessor(vp);
vp.setSuccessor(president);
//enter ctrl+c to kill.
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"));
}
 
}
}
</pre>
[[Image:javacodeSolution.GIF]]
----
=== C# Example ===
'''Example 1''' - This code can be found at [http://www.c-sharpcorner.com/UploadFile/rmcochran/chain_of_command01172007143425PM/chain_of_command.aspx www.c-sharpcorner.com]
Our command will be a PhoneCall class with one method "Converse()" which is our command.
*Hello. This is ACME Movie Rentals with an important message.
----
 
'''Example 2''' - This code can be found at [http://www.dofactory.com/Patterns/PatternChain.aspx#_self1 www.dofactory.com]
<pre>
using System;
 
namespace DoFactory.GangOfFour.Chain.RealWorld
 
{
 
// MainApp test application
 
class MainApp
{
static void Main()
{
// Setup Chain of Responsibility
Director Larry = new Director();
VicePresident Sam = new VicePresident();
President Tammy = new President();
Larry.SetSuccessor(Sam);
Sam.SetSuccessor(Tammy);
 
// Generate and process purchase requests
Purchase p = new Purchase(2034, 350.00, "Supplies");
Larry.ProcessRequest(p);
 
p = new Purchase(2035, 32590.10, "Project X");
Larry.ProcessRequest(p);
 
p = new Purchase(2036, 122100.00, "Project Y");
Larry.ProcessRequest(p);
 
// Wait for user
Console.Read();
}
}
 
// "Handler"
 
abstract class Approver
{
protected Approver successor;
 
public void SetSuccessor(Approver successor)
{
this.successor = successor;
}
 
public abstract void ProcessRequest(Purchase purchase);
}
 
// "ConcreteHandler"
 
class Director : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 10000.0)
{
Console.WriteLine("{0} approved request# {1}",
this.GetType().Name, purchase.Number);
}
else if (successor != null)
{
successor.ProcessRequest(purchase);
}
}
}
// "ConcreteHandler"
 
class VicePresident : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 25000.0)
{
Console.WriteLine("{0} approved request# {1}",
this.GetType().Name, purchase.Number);
}
else if (successor != null)
{
successor.ProcessRequest(purchase);
}
}
}
 
// "ConcreteHandler"
 
class President : Approver
{
public override void ProcessRequest(Purchase purchase)
{
if (purchase.Amount < 100000.0)
{
Console.WriteLine("{0} approved request# {1}",
this.GetType().Name, purchase.Number);
}
else
{
Console.WriteLine(
"Request# {0} requires an executive meeting!",
purchase.Number);
}
}
}
 
// Request details
 
class Purchase
{
private int number;
private double amount;
private string purpose;
 
// Constructor
public Purchase(int number, double amount, string purpose)
{
this.number = number;
this.amount = amount;
this.purpose = purpose;
}
 
// Properties
public double Amount
{
get{ return amount; }
set{ amount = value; }
}
 
public string Purpose
{
get{ return purpose; }
set{ purpose = value; }
}
 
public int Number
{
get{ return number; }
set{ number = value; }
}
}
}
</pre>
----
== External Links References ==*External Links# [http://www.javaworld.com/javaworld/jw-08-2003/jw-0829-designpatterns.html Java World]# [http://www.developer.com/java/other/article.php/631261 Developer.com]# [http://www.oodesign.com/oo_design_patterns/behavioral_patterns/chain_of_responsibility.html OODesign.com]# [http://codebetter.com/blogs/jeremy.miller/archive/2005/11/06/134359.aspx Codebetter.com]# [http://www.c-sharpcorner.com/UploadFile/rmcochran/chain_of_command01172007143425PM/chain_of_command.aspx C-Sharpcorner.com]# [http://www.javacamp.org/designPattern/chains.html Javacamp.org]
----
--[[User:Djeyarat|Djeyarat]] 1521:4956, 2 April 2007 (EDT)
1
edit

Navigation menu