这是使用接口回调的正确方法吗?

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?

这种方式不太正确。

你说的是 ObserverSubscriber/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 接口达成一致组件将进行交互,另外假设这两者之一的实现取决于您,而另一个将由您的队友实现,因此为了实现互操作性,您的代码必须符合该接口,您的队友也是如此。

在您的情况下,您实际上是将该标准接口合并到您自己的组件中,因此您的队友可能对此不满意。

长话短说:

你的方法不好