我看了this和this并发现在课程B
中我需要保存对课程A
的引用以及课程B
中发生的事情我们执行由类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
}
}
}
我觉得这种方式更易读,更容易理解,但不确定这是不是很糟糕。那么我可以自由地走这条路吗?
答案 0 :(得分:1)
在我看来,这不是一个好的编程方式。通常,您甚至不需要接口来实现此类设计,您可以在实例化时覆盖类的每个方法。实际上你并没有实例化那个类,而是实例化了一个将该类子类化的匿名类。
让我们回到这个问题,接口意味着按字面意思使用。它们应该用作两个组件之间的接口。从软件工程的角度来看,假设您是一个开发大型软件系统的团队,在这种情况下,在设计阶段,您的团队成员应该就标准和全球可接受的界面达成一致,两个组件都是进行互动,并且另外假设这两个中的一个的实现取决于你,而另一个将由你的队友实施,因此为了互操作性,你的代码必须符合该界面,对你的队友也是如此。
在您的情况下,您实际上将该标准界面合并到您自己的组件中,因此您的队友可能对此不满意。
TL; DR:
你的做法并不好。
答案 1 :(得分:0)
所以我可以自由地走这条路吗?
这种方式不太正确。
您所谈论的内容称为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();
}
...
}
听众示例:
如果上述内容对您有点疑惑,请考虑刚刚在Button
中初始化的Activity
。该按钮充当发布者,而Activity
充当订阅者。当用户单击按钮(发布新杂志)时,Activity
希望收到通知,因此它使用setOnClickListener()
订阅事件,其中传递给方法的View.OnClickListener
参数为订阅表格。 Activity
(订阅者)填写表单,通过实现接口并覆盖onClick()
方法,并将表单传递给方法(subscribe)。发生点击时,Activity
会收到通知。