gpt4 book ai didi

java - 用于创建 JMSMessages 的装饰模式/超时应该从哪里开始

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:18 25 4
gpt4 key购买 nike

我开始构建一个消息传递框架,并决定使用装饰模式来创建 JMSMessages。

class BaseMessage implements Message { ... }

抽象装饰

class AbstractDecoration implements Message {
Message message;

public AbstractDecoration(Message message) {
this.message = message
}
}

装饰示例:

class JsonPayloadDecoration extends AbstractDecoration { ... }

使用示例:

...

IMessage m = new BaseMessage(...);
m = new ExpireDecoration(m, 10, TimeUnit.MINUTES);
m = new TextPayloadDecoration(m, "Text!");
m = new CorrelationDecoration(m, "123456");
m = new PriorityDecoration(m, 9);
m = new NonPersistentDecoration(m);
m = new QueueDestinationDecoration(m, "JMSTEST.DECORATIONTEST1");
m = new ErrorHandlerDecoration(m, errorhandler, 1000);

// requestor handles MessageProducers
// m.send will create the real JMSMessage and use the requestor
// to send the message with a MessageProducer
m.send(requestor);

首先我想获得一些关于整个装饰想法的意见,现在谈谈我真正的问题。 ErrorHandlerDecorationerrorhandler 超时。 超时应该什么时候开始?当它被创建时或者当m.send被调用时?我正在和同事争论这个问题。

最佳答案

当消息发送时间过长时,不是会触发“超时”吗?它可能应该在调用 send 时启动,除非构造函数除了填充字段之外还做了一些特殊的事情。

关于您关于使用装饰器模式是否明智的问题:装饰器模式非常适合提供功能排列,这似乎就是您的情况(但是,您的代码示例中不存在这种用法)。如果您只想对消息应用一种装饰器,请考虑使用策略模式。

还要小心互斥的装饰器。如果您有太多这样的装饰器,那么跟踪哪些装饰器与哪些装饰器兼容可能会令人困惑。

编辑以回应您的评论:确保不兼容的装饰器不一起使用的一种方法是获取迄今为止应用于对象的装饰器列表,并在看到冲突时抛出异常。要获取装饰器列表,可以将此方法添加到 AbstractDecoration:

List<AbstractDecoration> getDecorations() {
List<AbstractDecoration> decorations;
if (message instanceof AbstractDecoration) {
decorations = ((AbstractDecoration) message).getDecorations();
}
else {
decorations = new ArrayList<AbstractDecoration>();
}

decorations.add(this);
return decorations;
}

因此,一旦您已经应用了装饰器列表,只需检查每个装饰器的instanceof即可检测冲突。请注意,您必须在相关的互斥装饰器的两端执行此操作,否则当装饰器以一种顺序与另一种顺序应用时,将不会发生此验证。

有点像黑客。我不是装饰器模式的专家,所以我不知道解决这个问题的标准是什么;我当场想出了这个。

编辑:经过更多思考后,在 AbstractDecoration 的构造函数中进行此验证可能更有意义。然后,您的规则是集中的,您甚至可以将它们委托(delegate)给另一个类。

关于java - 用于创建 JMSMessages 的装饰模式/超时应该从哪里开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15381311/

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