2015-12-14 40 views
2

我想通過搜索Servicer類字符串中的字符/字符串來演示責任鏈模式的使用。代碼運行但Servicer1 ServiceReq未調用Servicer2 ServiceReq。如果我用「g」運行這個,我只會得到「Checked Servicer1」,但我應該得到「Checked Servicer1」「」在Servicer 2中找到請求「。Chain of Responsibility- Servicer1 not calling Servicer2

MainApp.cs 
namespace ChainOfResponsibility 
{ 
    abstract class Servicer 
    { 
     protected Servicer successor; 

     public void SetSuccessor(Servicer s) 
     { 
      successor = s; 
     } 
     public abstract string ServiceReq(char request); 
    } 

    class Servicer1 : Servicer 
    { 
     public override string ServiceReq(char request) 
     { 
      string s1 = "Sam ate nuts"; 
      if (s1.Contains(request)) 
      { 
       return "Request found in Servicer 1"; 
      } 
      else if (successor != null) 
      { 
       successor.ServiceReq(request); 
      } 
      return "Checked Servicer1'"; 
     } 
    } 

    class Servicer2 : Servicer 
    { 
     public override string ServiceReq(char request) 
     { 
      string s2 = "Apples are great"; 
      if (s2.Contains(request)) 
      { 
       return "Request found in Servicer 2"; 
      } 
      else if (successor != null) 
      { 
       successor.ServiceReq(request); 
      } 
      return "Checked Servicer 2"; 
     } 
    } 

表格代號:

namespace ChainOfResponsibility 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      char request = System.Convert.ToChar(textBox1.Text); 
      Servicer h1 = new Servicer1(); 
      Servicer h2 = new Servicer2(); 
      h1.SetSuccessor(h2); 

      AddToList(h1.ServiceReq(request)); 
     } 
     private void AddToList(string message) 
     { 
      listBox1.Items.Add(message); 

      listBox1.Items.Add("----------------------------------------"); 

      if (listBox1.Items.Count > 0) 
       listBox1.TopIndex = listBox1.Items.Count - 1; 
     } 
    } 
} 
+0

請發佈您已經嘗試過的和您的預期結果 – RyanR

+1

您通過表單提供的輸入是什麼?此外,您的預期輸出永遠不會發生;你可以調用'successor.ServiceReq',但是不要對返回值做任何事情。 –

+0

您可以調用'successor.ServiceReq(request);'但是不返回任何值。 –

回答

0

第一個問題是,你永遠不會做的successor.ServiceReq返回任何有價值的東西。接下來的問題是,你似乎想要從ServiceReq返回多個消息。爲此,您應該使返回類型IEnumerable<string>,並對您的代碼進行相應的調整。

這裏是你如何調整你的「服務人」:

abstract class Servicer 
{ 
    ... 
    public abstract IEnumerable<string> ServiceReq(char request); 
} 

class Servicer1 : Servicer 
{ 
    public override IEnumerable<string> ServiceReq(char request) 
    { 
     string s1 = "Sam ate nuts"; 
     yield return "Checked Servicer1"; 
     if (s1.Contains(request)) 
     { 
      yield return "Request found in Servicer 1"; 
     } 
     else if (successor != null) 
     { 
      yield return successor.ServiceReq(request); 
     } 
    } 
} 

// Similar changes for Servicer2 

這裏是改變你的表單代碼:

namespace ChainOfResponsibility 
{ 
    public partial class Form1 : Form 
    { 
     ... 
     private void AddToList(IEnumerable<string> messages) 
     { 
      listBox1.Items.AddRange(messages); 

      ... 
     } 
    } 
} 

這將導致包含您期望的輸出列表,提供您已在文本框中輸入適當的字符。