gpt4 book ai didi

c# - 我应该在这里使用哪种设计模式

转载 作者:行者123 更新时间:2023-11-30 22:42:18 26 4
gpt4 key购买 nike

出于学习目的,我正在编写一个基于套接字的客户端/服务器应用程序。我设计了一个自定义协议(protocol)来确保我可以正确处理我的数据包。今天在检查一些较旧的代码部分时,我意识到我创建数据包的方式包含很多冗余代码。

我有不同类型的数据包,例如ImagePacket、MessagePacket 等。所有类型的创建仅在次要内容上有所不同,例如, header 和分隔符的创建是相同的。

为了改进这一点,我提出了这样的解决方案(简化):

abstract class Packet
{
public Packet(object o)
{
MemoryStream memoryStream = new MemoryStream();

AddHeader(ref memoryStream);
AddData(ref memoryStream, obj);
AddDelimiter(ref memoryStream);
_packetBytes = memoryStream.ToArray();

memoryStream.Close();
}
protected abstract void AddData(ref MemoryStream ms, object obj);

AddData 方法作为抽象方法实现并在具体类中被覆盖,而 AddHeader 和 AddDelimiter 是在抽象类 Packet 本身中定义的。

这工作正常,我没有像以前那样多的重复代码,但我不满意将对象传递给 AddData,因为没有明确指出我不能将字符串提供给 ImagePacket 构造函数。

// correct
Packet myMsgPacket = new MessagePacket("hello world");
Packet myImagePacket = new ImagePacket(image);
// wrong, but will be compiled :(
Packet myChaosPacket = new ImagePacket("muaha you're doomed");

如果我必须检查传递的数据类型是否正确,我将再次得到大量愚蠢的代码。如何既能减少重复代码又能解决上述问题?

最佳答案

这听起来像是你需要使用工厂模式

Packet MyPacket = MyPacketFactory.CreatePacket(Data)

MyFactory.CreatePacket 然后会返回一个 IPacket

更新:根据下面的评论,我应该更清楚。您的工厂可以有许多采用不同数据类型的重载 CreatePacket() 方法...

IPacket CreatePacket(Image Data) {}
IPacket CreatePacket(String Data) {}
IPacket CreatePacket(Exception Data) {}

并且如果您有多种类型的数据包只包含字符串(例如消息数据包、状态数据包或类似的数据包),您可以创建一个枚举来指示需要哪个字符串数据包...

IPacket CreatePacket(String Data, StringPacketTypesEnum PacketType) {}

在您的数据包工厂中,您可以拥有处理所有重复代码的通用函数 - 例如 AddDelimiter() - 这将保留您的代码 DRY

关于c# - 我应该在这里使用哪种设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481483/

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