使用策略模式发送不同的消息

Using the strategy pattern to send different message

我有一个基本的 class,它采用套接字连接并根据调用的重载方法发送不同的消息

public void send(byte[] message) {...}
public void send(String message) {...}
...

每个方法参数最终都会转换为字节数组,根据协议通过套接字发送。我正在研究策略模式,它似乎是适用的。我可以有不同的发送策略,而不是让一个 class 具有多个重载方法。我唯一的问题是如何解释不同的消息参数类型?或者如果有更好的方法我想念,请告诉我。

您可以使用带有 send(Object obj) 方法的处理器接口。

然后您可以使用 StringProcessor、ByteArrayProcessor 等实现来处理适当的操作。

根据消息的类型,调用者必须实例化适当的处理器类型。

嗯,引用Wikipedia,"the strategy pattern [...] is a software design pattern that enables an algorithm's behavior to be selected at runtime."

在这里,您希望在编译时选择您的行为,因为它取决于要发送的消息的类型。

所以,为了简单起见,策略 DP 在这里不适用。

实际上,事情要复杂一些。您实际上可以编写一个 public void send(Object message),然后使用反射来确定正确的策略,方法是从对象 class 名称派生它(此处作为 class,例如 myprogram.sendmessage.strategies.Integer ) -- 当心模板 classes ;然后使用这个策略发送消息。

但是,您将丢失任何编译时检查,以确保此类消息实际上可以发送。

现在的问题是:仅仅使用不适合该应用程序的 DP 真的值得所有这些麻烦吗?

无论如何,可能有更好的方法,这取决于您的协议是否已经严格。您可以只实现一个 send(Serializable o) 函数,然后让 Java 执行在流内外序列化对象 o 的魔法。

将泛型与经典策略模式设计相结合如何:

//Strategy Contract
public interface SendStrategy<F>{
    public void send(F data);
}

public class StringSender implements SendStrategy<String>{
    public void send(String data){};
}

public class ByteArraySender implements SendStrategy<byte[]>{
    public void send(byte[] data){};
}