设计模式--职责链(学习)
职责链---http://www.cnblogs.com/sc0791/p/3687856.html
/// <summary> /// 请求类 场景 /// </summary> class Context { public Context(int day) { this.day = day; } private int day; public int Day { get { return day; } set { day = value; } } }
代码剖析
首先,该模式运用的是最基本的继承关系
1,抽象类--提供操作人的姓名,并保存一个该类的实例,同时提供一个抽象的Pass方法
/// <summary> /// 抽象基类 /// </summary> abstract class Handler { public Handler(string name) { _name = name; } private string _name; public string Name { get { return _name; } set { _name = value; } } private Handler _handler; public Handler handler { get { return _handler; } set { _handler = value; } } //是否通过 public abstract bool Pass(Context context); }
子类--用于重写pass方法,给对象的handler赋值,在pass方法中通过调用指定handler属性实现一级一级的向下传递(这里的handler为下一级别的更高权限的操作)
/// <summary> /// 部门经理 2天以下的部门签字就成了 /// /// </summary> public class Manager : Handler { public Manager(string name) : base(name) { } public override bool Pass(Context context) { if (context.Day <= 2) { Console.Write("{0}已经签字通过", Name); return true; } return handler.Pass(context); } } /// <summary> /// 总经理 2天以上需要总经理签字 /// </summary> public class GeneralManager : Handler { public GeneralManager(string name) : base(name) { } public override bool Pass(Context context) { if (2 < context.Day) { Console.Write("{0}已经签字通过", Name); return true; } return handler.Pass(context); } } /// <summary> /// 董事长 7天以上需要总经理签字 /// </summary> public class President : Handler { public President(string name) : base(name) { } public override bool Pass(Context context) { if (context.Day > 7) { Console.Write("{0}已经签字通过", Name); return true; } return handler.Pass(context); } }
操作代码--通过指定的天数,判断是哪个级别的范围,不在本类范围内的交给handler操作
class Program { static void Main(string[] args) { Context context = new Context(3); Handler manager = new Manager("部门经理"); Handler gmanager = new GeneralManager("总经理"); Handler president = new President("董事长");
//通过给其handler赋值实现传递 manager.handler = gmanager; //部门经理的上级是总经理 gmanager.handler = president; //总经理的上级是董事长 manager.Pass(context); //调用最初级的pass方法 Console.ReadLine(); } }