1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //Handler h = new ConcreateHandler1().SetNext(new ConcreateHandler2()).SetNext(new ConcreateHandler3()); //これだとダメ。インスタンスがネストされない。 Handler h = new ConcreateHandler1(); h.SetNext(new ConcreateHandler2()).SetNext(new ConcreateHandler3()); /* hを生成した時点で、1,2,3コンストラクタが呼ばれている。*/ h.Request(1); System.Console.ReadKey(); } } /* Chain of Responsibility */ abstract class Handler { protected Handler next; protected int level; public Handler SetNext(Handler handler) { this.next = handler; return this.next; } public void Request(int mask) { System.Console.WriteLine(this.ToString()); /* このコンテキストのthisは、 Request(1)とすると、 > ConcreateHandler1 だけ。 Request(2)とすると、 > ConcreateHandler1 > ConcreateHandler2 Request(3)とすると、 > ConcreateHandler1 > ConcreateHandler2 > ConcreateHandler3 */ if (this.level == mask) { System.Console.Write(mask); } else { if (next != null) next.Request(mask); } } } class ConcreateHandler1 : Handler { public ConcreateHandler1() { this.level = 1; } } class ConcreateHandler2 : Handler { public ConcreateHandler2() { this.level = 2; } } class ConcreateHandler3 : Handler { public ConcreateHandler3() { this.level = 3; } } } |