假设我有一个名为SocialNetworkService的接口,以及多个实现 - TwitterService,FacebookService和FriendFeedService,MyService等。
现在,每当我的托管bean收到消息时,我都希望根据消息中包含的某些规则选择一个/多个实现,并根据消息传输消息。
我不太确定哪种模式最好?
a)使用接口实例,即
@Inject @Any Instance<SocialNetworkService> socialNetworkService;
SocialNetworkService service = socialNetworkService.get();
我如何将消息传递给SocialNetworkServiceFactory?
b)使用事件观察所有服务中的事件(无论其界面如何,这都不是我想要的。即如果我不支持不传输......
C)。我可以注意注射,即 @Twitter,@ Facebook都在一个控制器bean中然后选择合适但我的服务实现号会增长....
提前致谢,
迪米特里
答案 0 :(得分:0)
您始终可以使用迭代器来获取所有当前实现
Iterator<SocialNetworkService> it = socialNetworkService.iterator();
while(it.next()) {
SocialNetworkService service = it.next();
//here you can choose by some criterion if the service should receive message or not
if(service instanceof TwitterNetworkService) {
//do something
}
}
答案 1 :(得分:0)
事件/观察者模型可能是最适合您的。您可以使用一个或多个限定符触发事件,每个限定符都可以绑定到其中一个服务。
答案 2 :(得分:0)
我建议结合方法a)和b)。
在您的Managed Bean中发送一个所需类型的事件。
现在,您将拥有此特定事件的单个事件观察者。此观察者注入SocialNetworkService的所有可用实现。
SocialNetworkService的每个实现现在都应该实现一个accept方法。这意味着当添加新服务时,您不需要更改观察者类。
观察者现在遍历所有可用实例并将检索到的消息(可能是事件本身)移交给每个实现的accept方法。