设计模式中有一个职责链模式的介绍解决问题是:处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
通过这个模式就使得在出现一些请求要处理时可以通过这个模式的设置,让请求按照规定好的路线执行,就是逐级的审批出现权限不够时自动转交个下个处理者,就这么一个过程,直到请求被转交到一个权限足够的处理者手中将请求处理为止。
这些请求的传递都是在你使用的过程中设置好的,
同时还符合单一职责原则和开闭原则
设置处理请示的接口
abstract class Handler { protected Handler successor; //设置继承者 public void SetSuccessor(Handler successor) { this.successor = successor; } //供子类重写的父类方法,进行请求的传递 public abstract void HandlerRequest(int request); }
实际处理类
class ConreteHandler1:Handler { public override void HandlerRequest(int request) { if (request>=0&& request<10) { Console.WriteLine("{0} 处理请求{1}",this.GetType().Name,request); } else if (successor!=null) { //请求的传递 successor.HandlerRequest(request); } } }
其余两个处理着类与第一个相同只是范围不一样而已
客户端
static void Main(string[] args) { Handler h1 = new ConreteHandler1(); Handler h2 = new ConreteHandler2(); Handler h3 = new ConreteHandler3(); h1.SetSuccessor(h2);//设置继承在h1无法处理后由h2处理 h2.SetSuccessor(h3);//同理,h2无法处理后由h3处理 int[] requests = { 2, 4, 5, 7, 8, 12, 23, 27, 6 }; foreach (int request in requests) { h1.HandlerRequest(request); } Console.Read(); }
在客户端当中设置好处理这类的继承循序,然后剩下的就是按照设置好的顺序执行了,这么做的好处就是请求发送者和处理者之间不知道是谁,但是也会出现一个问题,就是发送的请求可能到了最后一个处理者手中得不到处理的情况或者因为没有正确的配置而得不到处理,通俗的说就是你想要邮寄一封信,但是你信的地址写的不对,那么你这封信最终肯定是无法送达的。