观察多个可观察对象同时避免java中的instanceof运算符?
如果我有一个对象,我希望能够观察其他几个可观察对象,而不是所有对象都是同一类型。例如,我希望 A 能够观察 B 和 C。B 和 C 完全不相关,除了它们都实现了 Observable。
显而易见的解决方案就是在更新方法中使用“if instanceof”,但这很快就会变得混乱,因此我想知道是否还有其他方法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一个干净的解决方案是在 A 中使用(匿名)内部类来充当观察者。例如:
这将允许您将
BObserver
/CObserver
实例添加到任意数量的B
和C
中其实很想看。它还有一个额外的好处,即A
的公共接口不太混乱,并且您可以轻松添加新的内部类来处理类D
、E
和F
。A clean solution would be to use (anonymous) inner classes in
A
to act as theObserver
s. For example:This will allow you to add
BObserver
/CObserver
instances to however manyB
s andC
s you actually want to watch. It has the added benefit thatA
's public interface is less cluttered and you can easily add new inner classes to handle classesD
,E
andF
.与之前的建议类似,您可以更改更新。
添加一个方法
通过这种方式,您可以为您想要观察的每种类型 。不幸的是,您需要知道 Observable 的确切具体类型。但是,您可以更改反射以允许接口等。
Similar to previous suggestions you could change you update to.
This way you can add one method
for each type you want to observe. Unfortunately you need to know the exact concrete type of the Observable. However you could change the reflections to allow interfaces etc.
假设对象 B/C 上的操作是相同的,并且您只想区分两个对象以实现状态杂耍,您还可以创建一个委托对象来实现实际的观察逻辑/状态,并在您的 main 中使用查找机制对象来检索特定 Observable 对象的正确委托。然后转接电话。
Assuming that the operations on object B/C would be identical and you merely want to distinguish between the two objects for state juggling purposes, you could also create a delegate object which implements the actual observation logic/state and use a lookup mechanism in your main object to retrieve the right delegate for the particular Observable object. Then forward the calls.
你总是可以有一个
Map, EventHandler>
。类似,但没有明确的“instanceof”运算符。它在地图中被containsKey()
替换。You can always have a
Map<Class<? extends Event>, EventHandler>
in your listener. Similar, but no explicit 'instanceof' operator. It gets replaced withcontainsKey()
in a map.