2

我试图通过在 Servicer 类字符串中搜索字符/字符串来演示责任链模式的使用。代码运行,但 Servicer1 ServiceReq 未调用 Servicer2 ServiceReq。如果我用“g”运行它,我只会得到“Checked Servicer1'”,但我应该得到“Checked Servicer1'”“在 Servicer 2 中找到请求”。

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;
        }
    }
}
4

1 回答 1

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);

            ...
        }
    }
}

如果您在文本框中输入了适当的字符,这将生成包含预期输出的列表。

于 2015-12-14T19:43:21.670 回答