您的位置:首页 > 其它

笔记-大话设计模式-24 职责链模式

2015-09-09 13:19 225 查看
类有太多的责任,这违背了单一职责原则,增加新的管理类别,需要修改这个类,违背了开放-封闭原则。

职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。

Demo1:

abstract class Handler
{
protected Handler successor;

public void SetSuccessor(Handler successor)
{
this.successor = successor;
}

public abstract void HandleRequest(int requestLevel);
}


class AHandler : Handler
{
public override void HandleRequest(int requestLevel)
{
if (requestLevel >= 0 && requestLevel < 10)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel);
}
else if (successor != null)
{
successor.HandleRequest(requestLevel);
}
}
}


class BHandler : Handler
{
public override void HandleRequest(int requestLevel)
{
if (requestLevel >= 10 && requestLevel < 20)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel);
}
else if (successor != null)
{
successor.HandleRequest(requestLevel);
}
}
}


class CHandler : Handler
{
public override void HandleRequest(int requestLevel)
{
if (requestLevel >= 20 && requestLevel < 30)
{
Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel);
}
else if (successor != null)
{
successor.HandleRequest(requestLevel);
}
}
}


Test:

Handler h1 = new AHandler();
Handler h2 = new BHandler();
Handler h3 = new CHandler();

h1.SetSuccessor(h2);
h2.SetSuccessor(h3);

int[] requests = { 0, 12, 32 };
foreach (var item in requests)
{
h1.HandleRequest(item);
}




Demo2:

abstract class Manager
{
protected string name;
protected Manager higher;

public Manager(string name, Manager higher)
{
this.name = name;
this.higher = higher;
}

public abstract void HandlerRequest(Request request);
}


class CommonManager : Manager
{
public CommonManager(string name, Manager higher)
: base(name, higher)
{

}
public override void HandlerRequest(Request request)
{
if (request.Type == "请假" && request.Number <= 2)
{
Console.WriteLine("{0}: {1} 数量{2} 被批准", name, request.Content, request.Number);
}
else if (higher != null)
{
higher.HandlerRequest(request);
}
else
{
Console.WriteLine("{0} 驳回请求", name);
}
}
}


class Majordomo : Manager
{
public Majordomo(string name, Manager higher)
: base(name, higher)
{

}
public override void HandlerRequest(Request request)
{
if (request.Type == "请假" && request.Number <= 5)
{
Console.WriteLine("{0}: {1} 数量{2} 被批准", name, request.Content, request.Number);
}
else if (higher != null)
{
higher.HandlerRequest(request);
}
else
{
Console.WriteLine("{0} 驳回请求", name);
}
}
}


class Request
{
private string type;

public string Type
{
get { return type; }
set { type = value; }
}

private string content;

public string Content
{
get { return content; }
set { content = value; }
}

private int number;

public int Number
{
get { return number; }
set { number = value; }
}

}


Test:

Manager m1 = new CommonManager("经理", new Majordomo("总监", null));
Request r1 = new Request();
r1.Type = "请假";
r1.Content = "请假回见";
r1.Number = 6;
m1.HandlerRequest(r1);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: