Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中松耦合的好模式?_Java - Fatal编程技术网

Java中松耦合的好模式?

Java中松耦合的好模式?,java,Java,我是Java新手,在阅读文档的同时,到目前为止,我找不到任何在对象之间松散耦合编程的好方法。对于我所知道的大多数语言(C++、C#、python、JavaScript),我可以将对象管理为具有“信号”(关于发生的事情/需要的事情的通知)和“插槽”(可以连接到信号和进程通知/做一些工作的方法)的对象。在所有提到的语言中,我都可以这样写: Object1 = new Object1Class(); Object2 = new Object2Class(); Connect( Object1.Item

我是Java新手,在阅读文档的同时,到目前为止,我找不到任何在对象之间松散耦合编程的好方法。对于我所知道的大多数语言(C++、C#、python、JavaScript),我可以将对象管理为具有“信号”(关于发生的事情/需要的事情的通知)和“插槽”(可以连接到信号和进程通知/做一些工作的方法)的对象。在所有提到的语言中,我都可以这样写:

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语言级别的下一级耦合:

  • 静态方法依赖性–高度耦合,用户代码知道精确的实现
  • 新实例创建依赖关系(A创建B的实例并使用其行为)-高,B不能替换
  • 反射依赖性–高度耦合,A知道B的精确实现
  • 继承依赖性(类B扩展A)-高度耦合,父类中的任何更改都会影响子类
  • 类实例依赖关系(类A引用了类B的实例)——中等,用户代码紧挨着特定的类层次结构,它是中等的,因为java不支持多重继承
  • 接口实例依赖关系(类A引用接口B的实例)-低,因为java支持多接口实现

  • 在高耦合上测试实现的简单方法是为其编写测试。

    Spring框架(用Java编写)基于控制反转。您实际上是在描述观察者模式。术语“松耦合”是一个相当抽象的概念,可以通过多种方式实现(在某些情况下无法实现)。+1因为猫也是人(也因为AspectJ是一种有趣的动物)对aspect J的很好的解释:-DAny hint什么确切的AspectJ功能可以提供帮助?正如我所看到的,它提供了许多面向aspect的编程功能。不幸的是,没有;我很久没有用它来提供详细的提示了。据我所知,如果observable有许多事件,我将需要编写单独的“添加观察者”对于每一个,并在每个这样的事件实现中调用相应的观察者?不一定。
    observer.update
    方法有一个附加的“用户数据”参数。在那里,您可以传输有关已更改内容的附加信息。这只是解决了问题。我需要序列化/反序列化函数参数或使用lambdas以某种方式封装参数,而不是在一行代码中进行函数到函数的连接:(这在大量接口和setter中是必需的:(.有没有办法减少代码的编写量?