我应该选择哪个选项来公开功能

本文关键字:功能 选项 选择 我应该 | 更新日期: 2023-09-27 18:08:00

我有一个处理与某些设备通信的类。我把这个类命名为Protocol。该类不包含任何状态信息,因此我创建了一个模型类,它应该公开协议类中的方法并包含设备的状态。

在我看来,有三种方法来实现这个

  1. 让模型类从协议继承
  2. 让模型类实现协议
  3. 让模型通过属性
  4. 公开协议

可能是协议包含的方法最好不暴露给模型类的实现者,这违背了选项1和3。

选项2让我选择我想从协议中暴露哪些东西,但大多数功能将只是对协议的调用,如:

DoSomething()
{
    protocol.DoSomething();
}

你认为什么是"更好"的选择?

注意::解耦状态和协议的原因是协议不是固定的,可以根据外部因素而改变。

我应该选择哪个选项来公开功能

你真的需要它们之间的继承关系吗?

interface IDevice
{
    // Some implementation
}
interface IProtocol : IDisposable
{
    void Open(IDevice device, string connection);
    void Close();
    void Send(object data);
    object Receive();
}

我过去曾使用过我们称之为命令处理程序的设计来处理类似的事情,下面是它的工作原理:

有一个CommandHandler类(好吧,组件真的-它有几个协作类)完成所有的工作(你提到的"。dosomething()")。这和上面的协议类是一样的。然而,这个CommandHandler类/组件不知道任何关于协议的信息。他只是使用了本地语言的结构(在你的例子中是c#类/接口)来完成工作。然后,将有一个或多个协议类完成将协议转换为语言结构的工作(例如,将XML转换为消息类,将二进制字节从流转换为类等),并通过从解码的协议创建其类的实例并将从协议派生的参数传递给这些实例方法来执行命令处理程序组件的功能。

为你的命令处理程序实现一个新的协议,编写协议类并让它处理你想要的任何协议,让它创建实例并调用其他协议所做的命令处理程序组件的方法,这样核心功能不会改变。

我希望这就是你要找的。