Csharp/CSharp Tutorial/Design Patterns/Chain Responsibility

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Chain Of Responsibility

<source lang="csharp">using System;

 public abstract class Job
 {
   protected Job nextJob;
   public abstract void DealWithRequirement(string requirement);
   public void NextInChain(Job next)
   {
     this.nextJob = next;
   }
   
 }
 public class ProgrammerJob: Job
 {
   public override void DealWithRequirement(string requirement)
   {
     switch (requirement)
     {
       case "Code":
         Console.WriteLine ("{0} has managed the code." ,this);
         break;
       default:
         if (nextJob != null)
           nextJob.DealWithRequirement(requirement);
         break;
     }
             
   }
   
   public ProgrammerJob(){;}
 }
 public class Requirement
 {
   public Requirement()
   {
   }
 }
 public class SeniorProgrammerJob: Job
 {
   public override void DealWithRequirement(string requirement)
   {
     switch (requirement)
     {
       default:
         Console.WriteLine("{0} has managed the " + requirement + " requirement." ,this); 
         break;
     }
   }
   public SeniorProgrammerJob(){;}
 }
 public class StaffJob: Job
 {
   public override void DealWithRequirement(string requirement)
   {
     switch (requirement)
     {
       case "Test":
         Console.WriteLine ("{0} has managed the test." ,this);
         break;
       default:
         if (nextJob != null)
           nextJob.DealWithRequirement(requirement);
         break;
     }
             
   }
   public StaffJob(){;}
 }
 class Client
 {
   static void Main(string[] args)
   {
     Job staff = new StaffJob();
     Job manager = new ProgrammerJob();
     Job seniorProgrammer = new SeniorProgrammerJob();
     
     staff.NextInChain(manager);
     manager.NextInChain(seniorProgrammer);
     staff.DealWithRequirement("Plan");
     staff.DealWithRequirement("Test");
     staff.DealWithRequirement("Code");
     staff.DealWithRequirement("Deploy");
   }
 }</source>