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

时间:2015-04-21 16:56:01

标签: java design-patterns

我有一个基本类,它接受套接字连接并发送不同的消息,具体取决于调用哪些重载方法

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

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

3 个答案:

答案 0 :(得分:2)

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

//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){};
}

答案 1 :(得分:0)

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

然后你可以使用StringProcessor,ByteArrayProcessor等实现来处理相应的操作。

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

答案 2 :(得分:0)

好吧,引用Wikipedia,&#34;策略模式[...]是一种软件设计模式,可以在运行时选择算法的行为。&#34;

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

因此,为简化起见,策略DP不适用于此。

实际上,事情有点复杂。你实际上可以编写一个public void send(Object message)然后使用反射来确定正确的策略,方法是从对象类名称中提取它(在这里作为一个类,例如myprogram.sendmessage.strategies.Integer) - 当心模板类;然后使用此策略发送消息。

但是,您丢失了任何编译时检查,实际上可以发送这种类型的消息。

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

无论如何,可能有更好的方法,取决于你的协议是否已经僵化。您可以实现一个send(Serializable o)函数,让Java可以将对象o序列化为流入和流出。