java message包_我应该如何在Java中实现Message类的子类型?

我确信这是一个基本的OOP问题 – 我正在设计一个消息传递系统,其中有几种完全不同的消息格式,但我希望它们都可以放在PriorityBlockingQueue上.我的第一个想法是定义一个抽象类Message,然后为每个消息类型定义扩展Message的子类.但这意味着,在接收端,消息处理器需要识别子类,以便知道如何处理消息的内容.我知道这样做的唯一方法是使用.instanceof()或Class.它似乎不太合适.

正如Scott Meyers所写,

Anytime you find yourself writing code of the form “if the object is

of type T1, then do something, but if it’s of type T2, then do

something else,” slap yourself.

(他继续指出,在多态性中,你应该有相同的方法名称,每个子类有不同的实现.我不知道如何让这个想法在我的情况下工作 – 消息类型本身是完全不相关的.)

为了便于讨论,以下是我的消息类型:

> ConsoleMessage,标识ConsoleObject和ObjectState.

> CardReaderRequestMessage,不包含任何东西,只是简单地请求“下一张牌”

> CardReaderMessage,包含一个字节[80]卡片图像和一个Last Card指示器

> CardPunchMessage,包含一个字节[80]卡片图像

> CardPunchResponseMessage,不包含任何内容,但表示卡片图像已复制到打孔缓冲区

我相信我必须知道我正在处理什么样的消息,所以我怀疑我不应该使用多态消息.我应该如何正确设计?

=====编辑提出后续问题=====

我试图找到一种方法来使用多态消息,而不是在某个时候识别它的子类.建议的方法是覆盖每个子类中的process()方法.这是我的(简化的)抽象消息和两个子类:

public abstract class Message {

public abstract void process() {

// subclasses of Message implement this

}

public static class ConsoleMessage extends Message {

private int obj;

private int state;

public ConsoleMessage(int x, int y) {

obj = x;

state = y;

}

@Override

public void process() {

// do something with obj and state?

}

public static class CardReaderMessage extends Message {

private byte[] card;

private boolean lastCardIndicator;

public CardReaderMessage(byte[] c, boolean lc) {

card = c;

lastCardIndicator = lc;

}

@Override

public void process() {

// do something with card and lastCardIndicator

}

}

所有“入站”消息的每个线程都有一个队列.假设我的线程需要等待来自控制台的消息“恢复”,但同时应该接收并处理其他消息类型:

waitForResumeMessage() {

while (true) { // the following will block until a msg arrives

Message msg = inboundMessageQueue.receiveMessage();

msg.process();

但现在呢? process()的一些实现已经在某处移动了一些数据,但最终我需要能够编写:

if // msg was ConsoleMessage "resume" command

return; // .. from waitForResumeMessage()

} // else iterate until another message

}

这基本上意味着找出’msg’类属于哪个类.

我接近这一切都错了吗?我意识到“等待”在“事件驱动”模型中并不合适,但这是一个长期运行的后台工作者.也许使用process()的想法对于改变引导事件驱动线程的FSM的状态更有用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值