gpt4 book ai didi

c# - 多种方法的正确 C# 设计模式是什么,所有方法都接受不同派生类的参数?

转载 作者:行者123 更新时间:2023-11-30 20:11:39 25 4
gpt4 key购买 nike

我有一个基类:

class Message

还有两个派生类:

class SimpleMessage : Message
class ComplexMesssage : Message

这些类型在代码的另一部分中使用如下:

void ProcessSimpleMessage(SimpleMessage m)
void ProcessComplexMessage(ComplexMessage m)

这些方法不在 Message 类中,因为处理不是消息的一部分。

现在,我想避免使用 if/else/switch 结构,因为消息的类型很多。在这里使用的最佳设计模式是什么?

一种选择是使用策略模式进行封装(至少在我看来是这样):

class ProcessableMessage
{
delegate void ProcessMessageDelegate(Message m)

private Message m;
private ProcessMessageDelegate ProcessMessage;
}

但是让所有处理方法都接受基类型 Message 并在内部进行转换真的是最佳实践吗?另一个问题是消息的动态类型(简单或复杂)实际上存储在此类中的两个位置 - 消息和处理算法,这看起来有点丑陋。

还有更好的解决方案吗?

谢谢!!
阿萨夫

最佳答案

我会在这里使用访问者模式:

public interface IMessageVisitor
{
void VisitSimple(SimpleMessage msg);
void VisitComplex(ComplexMessage msg);
}

public abstract class Message
{
public abstract void Accept(IMessageVisitor visitor);
}

public class SimpleMessage : Message
{
public override void Accept(IMessageVisitor visitor)
{
visitor.VisitSimple(this);
}
}

public class ComplexMessage : Message
{
public override void Accept(IMessageVisitor visitor)
{
visitor.VisitComplex(this);
}
}

public class MessageProcessor : IMessageVisitor
{
void IMessageVisitor.VisitSimple(SimpleMessage msg)
{ process simple message }

void IMessageVisitor.VisitComplex(ComplexMessage msg)
{ process complex message }

public void Process(Message msg)
{
msg.Accept(this);
}
}

关于c# - 多种方法的正确 C# 设计模式是什么,所有方法都接受不同派生类的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com