第24章 加薪非要老总批?——责任链模式
¥:度娘:¥[责任链模式]是一种¥[设计模式]。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下¥[动态]地重新¥[组织]和¥[分配]责任。
iOS设计模式解析:¥[责任链模式]的主要思想是,让可能接受某种请求的对象引用了同一类型的另一个对象,此对象又引用了可能会处理请求的其他对象,以此类推形成一条链。当用户把请求发给链中的某一个对象。如果这个对象不知道如何处理这个请求,它就把请求传给下一个响应器(即¥[successor](|səkˈsesə(r)| noun 继任者)),反之则处理此请求。
iOS设计模式解析:¥[责任链模式]使多个对象都有机会处理请求,从而避免请求的¥[发送者]和¥[接受者]之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。以下情况可考虑使用责任链模式:1:有多个对象可以处理请求,而处理程序只有在运行时才能确定。2:向一组对象发送请求,而不想显示指定处理请求的特定处理程序或者特定对象。
¥:大话设计模式:¥[责任链模式](Chain(|tʃeɪn|) of Responsibility(|rɪˌspɒnsəˈbɪləti|)):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的¥[耦合关系]。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
¥:大话设计模式:当客户提交一个请求时,请求是沿链传递直至有一个Concrete Handler对象负责处理它。这样请求者就不用管哪个对象来处理,反正该请求会被处理。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是责任链可简化对象的相互连接,它们仅需保存一个指向其后续者的引用,而不需保持它所有的候选接受者的引用。这样就大大降低了¥[藕合度]了。这样我们就可以随时随地增加或者修改处理一个请求的结构,增强了给对象指派责任的¥[灵活性]。当然也要注意一个请求到链的末端也没有得到处理的可能情况。
successor |səkˈsesə(r)| noun 继任者、替代物。
concrete |ˈkɒŋkriːt| noun 混凝土、adjective 混凝土制的、具体的、有形的、实的。
handler |ˈhændlə(r)| noun 驯兽师 处理者 经纪人、concrete handler
superior |suːˈpɪərɪə(r),sjuː-,sʊ-| A.adjective 上等的 更好的 占优势的 级别更高的 B.noun 上司 更优秀的人 更好的事物 修道院院长
24.2 加薪代码初步
//申请
class Request
{
//申请类别
private string requestType
public string RequestType
{
get { return requestType; }
set { requestType = value;}
}
//申请内容
private string requestContent;
public string RequestContent
{
get { return requestContent; }
set { requestContent = value;}
}
//数量
private int number;
public int Number
{
get { return Number; }
set { Number = value;}
}
}
//管理者
class Manager
{
protected string name;
public Manager(string name)
{
this.name = name;
}
public void GetResult (string managerLevel,Request request)
{
if(managerLevel == “经理”)
{
if(request.RequestType == “请假” && request.Number<=2)
{
Console.WriteLine(“数量<=2,被批准”);
}else{
Console.WriteLine(“数量>2,无权批准”);
}
}
else if(managerLevel == “总监”)
{
if(request.RequestType == “请假” && request.Number<=5)
{
Console.WriteLine(“数量<=5,被批准”);
}else{
Console.WriteLine(“数量>5,无权批准”);
}
}
else if(managerLevel == “总经理”)
{
if(request.RequestType == “请假”)
{
Console.WriteLine(“请假,被批准”);
}else if(request.RequestType == “加薪” && request.Number<=500){
Console.WriteLine(“加薪<=500,被批准”);
}
else if(request.RequestType == “加薪” && request.Number>500){
Console.WriteLine(“加薪>500,无权批准”);
}
}
}
}
24.3 责任链模式
abstract class Handler
{
protected Handler successor;
public void SetSuccessor(Handler successor)
{
this. successor = successor;
}
public abstract void HandleRequest(int request);
}
class ConcreteHandler1:Handler
{
public override void HandleRequest(int request)
{
if(request>0 && request<10)
{
XXXX
}
else if(successor != null)
{
successor. HandleRequest(request);
}
}
}
class ConcreteHandler2:Handler
{
public override void HandleRequest(int request)
{
if(request>=10 && request<20)
{
XXXX
}
else if(successor != null)
{
successor. HandleRequest(request);
}
}
}
class ConcreteHandler3:Handler
{
public override void HandleRequest(int request)
{
if(request>=20 && request<30)
{
XXXX
}
else if(successor != null)
{
successor. HandleRequest(request);
}
}
}
static void Main(string[] args)
{
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] requests = {2,4,14,22,34};
foreach(int request in requests)
{
h1.HandleRequest(request);
}
}