Java中松耦合的好模式?
我是Java新手,在阅读文档的同时,到目前为止,我找不到任何在对象之间松散耦合编程的好方法。对于我所知道的大多数语言(C++、C#、python、JavaScript),我可以将对象管理为具有“信号”(关于发生的事情/需要的事情的通知)和“插槽”(可以连接到信号和进程通知/做一些工作的方法)的对象。在所有提到的语言中,我都可以这样写:Java中松耦合的好模式?,java,Java,我是Java新手,在阅读文档的同时,到目前为止,我找不到任何在对象之间松散耦合编程的好方法。对于我所知道的大多数语言(C++、C#、python、JavaScript),我可以将对象管理为具有“信号”(关于发生的事情/需要的事情的通知)和“插槽”(可以连接到信号和进程通知/做一些工作的方法)的对象。在所有提到的语言中,我都可以这样写: Object1 = new Object1Class(); Object2 = new Object2Class(); Connect( Object1.Item
Object1 = new Object1Class();
Object2 = new Object2Class();
Connect( Object1.ItemAdded, Object2.OnItemAdded );
现在,如果object1
调用/发出itemsadded
,将调用Object2
的onimadded
方法。这种松耦合技术通常被称为“代理”、“信号槽”或“控制反转”
和接口模式相比,上述技术不需要将信号分组到一些接口中。只要签名匹配,任何对象的方法都可以连接到任何委托(C++Qt甚至通过只允许部分签名匹配扩展了这一点)。因此,我不需要为每个方法/方法组编写额外的接口代码,为未使用的接口方法提供默认实现等
我在Java中看不到类似的东西:(.也许我看错了?你应该看看Java中的Observable和Observator类,以实现信号类型的行为。主要思想是当Observable对象发生变化时,让观察者做一些动作 类是java.util.Observable,对象必须发送需要扩展的信号
接口是java.util.Observer,您的Observer类应该实现它来对信号进行操作。AspectJ可能会给您提供您想要的行为。我已经好几年没有接触过它了,但我记得它非常强大。但是如果您是java新手……我不会说“走开,”因为,嘿,你总有一天要学习的。小心点。我记得,AspectJ不仅仅给你足够的绳子吊死自己,它还给你足够的绳子绑死你的家人。包括你的猫。一种可能性是: “插槽”实现了一些接口,例如。 信令对象具有
INotifiable
对象列表和方法无效寄存器(INotifiable n)
当您想要向插槽发送信号时,请使用所有inotifiltes循环列表,并调用您自己定义的事件方法。您可以让一个对象实现一个合适的事件,让另一个对象触发此类事件。有关更多信息,请参阅。您可以找到关于模块耦合的大量信息,如java Iuish语言级别的下一级耦合:
在高耦合上测试实现的简单方法是为其编写测试。Spring框架(用Java编写)基于控制反转。您实际上是在描述观察者模式。术语“松耦合”是一个相当抽象的概念,可以通过多种方式实现(在某些情况下无法实现)。+1因为猫也是人(也因为AspectJ是一种有趣的动物)对aspect J的很好的解释:-DAny hint什么确切的AspectJ功能可以提供帮助?正如我所看到的,它提供了许多面向aspect的编程功能。不幸的是,没有;我很久没有用它来提供详细的提示了。据我所知,如果observable有许多事件,我将需要编写单独的“添加观察者”对于每一个,并在每个这样的事件实现中调用相应的观察者?不一定。
observer.update
方法有一个附加的“用户数据”参数。在那里,您可以传输有关已更改内容的附加信息。这只是解决了问题。我需要序列化/反序列化函数参数或使用lambdas以某种方式封装参数,而不是在一行代码中进行函数到函数的连接:(这在大量接口和setter中是必需的:(.有没有办法减少代码的编写量?