【责任链模式】
责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止
【介绍】
-
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关系请求的处理细节和请求的传递,所哟职责链将请求的发送者和请求的处理者解耦了
-
何时使用:在处理消息的时候过滤了很多处理者
-
如何解决:拦截类都实现统一接口
-
关键代码:Handler里面聚合他自己,在HanleRequest里判断是否合适,如果没有达到条件则向下传递,向传递之前set进去
-
优点:降低了耦合都,它将请求的发送者和接收者解耦了;简化了对象,是的对象不需要知道链的结构;增强给对象指派职责的灵活性,通过改变链内的成员或者调动他们的次序,允许动态地新增或者删除责任;增加新的请求处理类很方便
-
缺点:不能保证请求一定被接受;系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;可能不宜观允许时的特性,有碍于维护
【实现】
步骤一:管理者类,定义一个处理请示的接口
abstract class Manager
{
protected string name;
//管理者的上级
protected Manager superior;
public Manager(string name)
{
this.name = name;
}
//设置管理者的上级
public void SetSuperior(Manager superior)
{
this.superior = superior;
}
//审批请求
abstract public void RequestApplications(Request request);
}
步骤二:具体处理者类,处理它所负责的请求,可访问它的后继者
//纪委
class Discipline : Manager
{
public Discipline(string name) : base(name)
{
}
public override void RequestApplications(Request request)
{ //纪委所能有的权限就是可准许两小时内的假期
if (request.RequestType == "请假" && request.Number <= 2)
{
Console.WriteLine("{0}:{1} 请假时间:{2}小时 已批准", name, request.RequestContent, request.Number);
}
else
{
if (superior != null)
{
superior.RequestApplications(request);
}
}
}
}
//纪老师
class JIteacher : Manager
{
public JIteacher(string name):base (name)
{
}
public override void RequestApplications(Request request)
{ //纪老师所能有的权限就是可准许10小时内的假期
if (request.RequestType == "请假" && request.Number <= 10)
{
Console.WriteLine("{0}:{1} 请假时间:{2}小时 已批准", name, request.RequestContent, request.Number)
}
else
{
if (superior != null)
{
superior.RequestApplications(request);
}
}
}
}
//米老师
class Miteacher : Manager
{
public Miteacher(string name) : base(name)
{
}
public override void RequestApplications(Request request)
{ //米老师所以都处理
if (request.RequestType == "请假")
{
Console.WriteLine("{0}:{1} 请假时间:{2}小时 已批准", name, request.RequestContent, request.Number);
}
}
}
步骤三:申请类
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; }
}
}
步骤四:客户端代码
static void Main(string[] args)
{
Discipline jiwei = new Discipline("十五期纪委");
JIteacher jilaoshi = new JIteacher("纪老师");
Miteacher milaoshi = new Miteacher("米老师");
//设置上级,根据实际需求可改
jiwei.SetSuperior(jilaoshi);
jilaoshi.SetSuperior(milaoshi);
Request request = new Request();
request.RequestType = "请假";
request.RequestContent = "皮皮华";
request.Number = 1;
jiwei.RequestApplications(request);
Request request1 = new Request();
request1.RequestType = "请假";
request1.RequestContent = "皮皮杰";
request1.Number = 5;
jiwei.RequestApplications(request1);
Request request2 = new Request();
request2.RequestType = "请假";
request2.RequestContent = "皮皮飞";
request2.Number = 20;
jiwei.RequestApplications(request2);
Console.Read();
}
步骤六:显示结果
十五期纪委:皮皮华 请假时间:1小时 已批准
纪老师:皮皮杰 请假时间:5小时 已批准
米老师:皮皮飞 请假时间:20小时 已批准
【总结】
请假成功。