Chain Of
In Object Oriented Design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects . Each processing object contains a set of logic that describes the types of command objects that it can handle, and how to pass off those that it cannot to the next processing object in the chain. A mechanism also exists for adding new processing objects to the end of this chain.
In a variation of the standard chain-of-responsibility model, some handlers may act as dispatchers, capable of sending commands out in a variety of directions, forming a tree of responsibility . In some cases, this can occur recursively, with processing objects calling higher-up processing objects with commands that attempt to solve some smaller part of the problem; in this case recursion continues until the command is processed, or the entire tree has been explored. An XML interpreter (parsed, but not yet executed) might be a fitting example.
This pattern promotes the idea of loose coupling, which is considered a programming best practice.
Examples
Java
The following Java code illustrates the pattern with the example of a logging class. Each logging handler decides if any action is to be taken at this log level and then passes the message on to the next logging handler. The output is:
Writing to stdout: Entering function y. Writing to stdout: Step1 completed. Sending via e-mail: Step1 completed. Writing to stdout: An error has occurred. Sending via e-mail: An error has occurred. Writing to stderr: An error has occurred.
Note that this example should not be seen as a recommendation on how to write logging classes.
Also, note that in a 'pure' implementation of the chain of responsibility pattern, a logger would not pass responsibility further down the chain after handling a message. In this example, a message will be passed down the chain whether it is handled or not.
import
java.util.*
;
abstract
class
Logger
{
public
static
int
ERR
=
3
;
public
static
int
NOTICE
=
5
;
public
static
int
DEBUG
=
7
;
protected
int
mask
;
// The next element in the chain of responsibility
protected
Logger next
;
public
Logger setNext
(
Logger l
)
{
next
=
l
;
return
l
;
}
public
void
message
(
String
msg,
int
priority
)
{
if
(
priority
<=
mask
)
{
writeMessage
(
msg
)
;
}
if
(
next
!=
null
)
{
next.
message
(
msg, priority
)
;
}
}
abstract
protected
void
writeMessage
(
String
msg
)
;
}
class
StdoutLogger
extends
Logger
{
public
StdoutLogger
(
int
mask
)
{
this
.
mask
=
mask
;
}
protected
void
writeMessage
(
String
msg
)
{
System
.
out
.
println
(
"Writing to stdout: "
+
msg
)
;
}
}
class
EmailLogger
extends
Logger
{
public
EmailLogger
(
int
mask
)
{
this
.
mask
=
mask
;
}
protected
void
writeMessage
(
String
msg
)
{
System
.
out
.
println
(
"Sending via email: "
+
msg
)
;
}
}
class
StderrLogger
extends
Logger
{
public
StderrLogger
(
int
mask
)
{
this
.
mask
=
mask
;
}
protected
void
writeMessage
(
String
msg
)
{
System
.
err
.
println
(
"Sending to stderr: "
+
msg
)
;
}
}
public
class
ChainOfResponsibilityExample
{
public
static
void
main
(
String
args
)
{
// Build the chain of responsibility
Logger l,l1
;
l1
=
l
=
new
StdoutLogger
(
Logger.
DEBUG
)
;
l1
=
l1.
setNext
(
new
EmailLogger
(
Logger.
NOTICE
)
)
;
l1
=
l1.
setNext
(
new
StderrLogger
(
Logger.
ERR
)
)
;
// Handled by StdoutLogger
l.
message
(
"Entering function y."
, Logger.
DEBUG
)
;
// Handled by StdoutLogger and EmailLogger
l.
message
(
"Step1 completed."
, Logger.
NOTICE
)
;
// Handled by all three loggers
l.
message
(
"An error has occurred."
, Logger.
ERR
)
;
}
}
Here another example of this pattern in java. In this example we have different roles, each having a fix purchase power limit and a successor. Everytime a user in a role receives a purchase request, when it's over his limit, he just passes that request to his successor.
The PurchasePower abstract class with the abstract method processRequest.
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
)
;
}
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
(
reque
Chain rule - Wikipedia, the free encyclopedia
In calculus, the chain rule is a formula for the derivative of the composite of two functions. In intuitive terms, if a variable, y, depends on a second variable, u, which in turn ...
City Chain
Here is a flash in this page that you can't see.
Wallets / Chains - Accessories
Free Shipping on Any Order of $50 or More!
Chain - Wikipedia, the free encyclopedia
A chain is a series of connected links. This article is about the literal, physical chain. A chain may consist of two or more links. A chain is usually made of metal.
Custom Motorcycle Chains - Insane Chains
Unique custom motorcycle chains for your custom motorcycle, or sport bike. Available in painted or plated finishes. Custom colors are available on request.
BuyChains.com - The #1 Online Source for Custom-Made Jewelry Chains of ...
We Offer More Than 100 Styles of Jewelry Chain in Four Categories. Click on the "chain selection" link to view categories & entire ...
Chain Protection Services (NZ) Ltd
Chain Protection Services (NZ) Ltd, Christchurch, New Zealand ... is a private company with over 20 years experience in the chain industry specializing in snow, forestry and ...
Ramsey Products | Ramsey Silent Chain and Sprocket Solutions
Who We Are. For more than 85 years Ramsey Products has focused on helping customers with the selection and application of Silent Chain drives. Combine that experience and ...
Replacement Chain Saw Chains
uality replacement chainsaw chain for your all your chain saw parts and accessories needs.
Teleflex, chain, roller chain, conveyor chain, Sing triple speed chain ...
Manufacturer of chain, roller chain, conveyor chain, leaf chain, attachment chain.