In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of
command
objects and a series ofprocessing
objects. Eachprocessing
object contains logic that defines the types of command objects that it can handle; the rest are passed to the nextprocessing
object in the chain. A mechanism also exists for adding newprocessing
objects to the end of this chain. Wikipedia
Setting up the classes that made up the chain of responsibility.
First we create an interface for all the processing
objects.
protocol PurchasePower {
var allowable : Float { get }
var role : String { get }
var successor : PurchasePower? { get set }
}
extension PurchasePower {
func process(request : PurchaseRequest){
if request.amount < self.allowable {
print(self.role + " will approve $ \(request.amount) for \(request.purpose)")
} else if successor != nil {
successor?.process(request: request)
}
}
}
Then we create the command
object.
struct PurchaseRequest {
var amount : Float
var purpose : String
}
Finally, creating objects that made up the chain of responsibility.
class ManagerPower : PurchasePower {
var allowable: Float = 20
var role : String = "Manager"
var successor: PurchasePower?
}
class DirectorPower : PurchasePower {
var allowable: Float = 100
var role = "Director"
var successor: PurchasePower?
}
class PresidentPower : PurchasePower {
var allowable: Float = 5000
var role = "President"
var successor: PurchasePower?
}
Initiate and chaining it together :
let manager = ManagerPower()
let director = DirectorPower()
let president = PresidentPower()
manager.successor = director
director.successor = president
The mechanism for chaining up objects here is property access
Creating request to run it :
manager.process(request: PurchaseRequest(amount: 2, purpose: "buying a pen")) // Manager will approve $ 2.0 for buying a pen
manager.process(request: PurchaseRequest(amount: 90, purpose: "buying a printer")) // Director will approve $ 90.0 for buying a printer
manager.process(request: PurchaseRequest(amount: 2000, purpose: "invest in stock")) // President will approve $ 2000.0 for invest in stock