这是使用接口回调的正确方法吗?
Is that a right way of using interface callback?
我阅读了 this and this 并发现在 class B
中我需要保存对 class A
的引用并且当某些事情发生在 class B
我们执行一个由 class A
实现的接口定义的方法。好吧,我以某种方式理解了它。我以有点不同的方式使用接口来调用回调:
interface IHelper {
void onActionDone ();
void onActionFailed ();
}
public class Helper implements IHelper {
public Helper (Param param) {
// here we do what Helper class intended to do
// ...
// now call the any of callbacks
if(everything == OK) {
onActionDone();
} else {
onActionFailed();
}
}
@Override
public void onActionDone() {}
@Override
public void onActionFailed() {}
}
public class MainClass () {
new Helper(message) {
public void onActionDone () {
// here we can do anything we want after Helper will done its functions
}
public void onActionFailed () {
// or not done
}
}
}
我发现这种方式更具可读性和更容易理解,但不确定这是否是一种不好的做法。那么我可以更进一步吗?
So may i feel free to go this way further?
这种方式不太正确。
你说的是 Observer
或 Subscriber
/Publisher
模式。
简而言之:订阅者想要从发布者那里接收事件(杂志问题),所以他通知(订阅)发布者这件事。之后发布者通知订阅者事件发生。
在您的代码段中,发布者是 Helper
,订阅者是 MainClass
。发布者有订阅形式 IHelper
:
public class Helper {
IHelper mSubscriber;
...
void setSubscriber(IHelper subscriber) {
this.mSubscriber = subscriber;
}
...
}
订阅者应填写表格,即 implements IHelper
,并通知发布者关于自己的信息:
public class MainClass implements IHelper {
Helper mPublisher;
...
void someMethod() {
mPublisher.setSubscriber(this);
}
...
}
现在,当出版商出版新一期杂志时,会通知订阅者:
public class Helper {
...
void newMagazineIssued() {
mSubscriber.onActionDone();
}
void newMagazineFailed() {
mSubscriber.onActionFailed();
}
...
}
监听器示例:
如果上面所说的让您有点困惑,请考虑您刚刚在 Activity
中初始化的 Button
。按钮充当发布者,而 Activity
充当订阅者。 Activity
想要在用户点击按钮时得到通知(一本新杂志发行),所以它订阅了带有 setOnClickListener()
的事件,其中传递给方法的 View.OnClickListener
参数是订阅表格。 Activity
(订阅者)通过实现接口并覆盖 onClick()
方法来填写表单,并将表单传递给方法(订阅者)。发生点击时,Activity
会收到相关通知。
在我看来,这不是一种好的编程方式。通常你甚至不需要接口来实现这样的设计,你可以在实例化时覆盖 class 的每个方法。实际上你不是在实例化 class,而是在实例化一个匿名的 class,它是 class.
的子class
让我们回到问题上来,接口应该像字面意思一样使用。它们应该用作两个组件之间的接口。从软件工程的角度来看,假设您在一个开发 large-scale 软件系统的团队中,在这种情况下,在设计阶段,您和您的队友应该就标准和 globally-acceptable 接口达成一致组件将进行交互,另外假设这两者之一的实现取决于您,而另一个将由您的队友实现,因此为了实现互操作性,您的代码必须符合该接口,您的队友也是如此。
在您的情况下,您实际上是将该标准接口合并到您自己的组件中,因此您的队友可能对此不满意。
长话短说:
你的方法不好
我阅读了 this and this 并发现在 class B
中我需要保存对 class A
的引用并且当某些事情发生在 class B
我们执行一个由 class A
实现的接口定义的方法。好吧,我以某种方式理解了它。我以有点不同的方式使用接口来调用回调:
interface IHelper {
void onActionDone ();
void onActionFailed ();
}
public class Helper implements IHelper {
public Helper (Param param) {
// here we do what Helper class intended to do
// ...
// now call the any of callbacks
if(everything == OK) {
onActionDone();
} else {
onActionFailed();
}
}
@Override
public void onActionDone() {}
@Override
public void onActionFailed() {}
}
public class MainClass () {
new Helper(message) {
public void onActionDone () {
// here we can do anything we want after Helper will done its functions
}
public void onActionFailed () {
// or not done
}
}
}
我发现这种方式更具可读性和更容易理解,但不确定这是否是一种不好的做法。那么我可以更进一步吗?
So may i feel free to go this way further?
这种方式不太正确。
你说的是 Observer
或 Subscriber
/Publisher
模式。
简而言之:订阅者想要从发布者那里接收事件(杂志问题),所以他通知(订阅)发布者这件事。之后发布者通知订阅者事件发生。
在您的代码段中,发布者是 Helper
,订阅者是 MainClass
。发布者有订阅形式 IHelper
:
public class Helper {
IHelper mSubscriber;
...
void setSubscriber(IHelper subscriber) {
this.mSubscriber = subscriber;
}
...
}
订阅者应填写表格,即 implements IHelper
,并通知发布者关于自己的信息:
public class MainClass implements IHelper {
Helper mPublisher;
...
void someMethod() {
mPublisher.setSubscriber(this);
}
...
}
现在,当出版商出版新一期杂志时,会通知订阅者:
public class Helper {
...
void newMagazineIssued() {
mSubscriber.onActionDone();
}
void newMagazineFailed() {
mSubscriber.onActionFailed();
}
...
}
监听器示例:
如果上面所说的让您有点困惑,请考虑您刚刚在 Activity
中初始化的 Button
。按钮充当发布者,而 Activity
充当订阅者。 Activity
想要在用户点击按钮时得到通知(一本新杂志发行),所以它订阅了带有 setOnClickListener()
的事件,其中传递给方法的 View.OnClickListener
参数是订阅表格。 Activity
(订阅者)通过实现接口并覆盖 onClick()
方法来填写表单,并将表单传递给方法(订阅者)。发生点击时,Activity
会收到相关通知。
在我看来,这不是一种好的编程方式。通常你甚至不需要接口来实现这样的设计,你可以在实例化时覆盖 class 的每个方法。实际上你不是在实例化 class,而是在实例化一个匿名的 class,它是 class.
的子class让我们回到问题上来,接口应该像字面意思一样使用。它们应该用作两个组件之间的接口。从软件工程的角度来看,假设您在一个开发 large-scale 软件系统的团队中,在这种情况下,在设计阶段,您和您的队友应该就标准和 globally-acceptable 接口达成一致组件将进行交互,另外假设这两者之一的实现取决于您,而另一个将由您的队友实现,因此为了实现互操作性,您的代码必须符合该接口,您的队友也是如此。
在您的情况下,您实际上是将该标准接口合并到您自己的组件中,因此您的队友可能对此不满意。
长话短说:
你的方法不好