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

时间:2016-01-10 21:12:13

标签: java android design-patterns listener observer-pattern

我看了thisthis并发现在课程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
        }
    }
}

我觉得这种方式更易读,更容易理解,但不确定这是不是很糟糕。那么我可以自由地走这条路吗?

2 个答案:

答案 0 :(得分:1)

在我看来,这不是一个好的编程方式。通常,您甚至不需要接口来实现此类设计,您可以在实例化时覆盖类的每个方法。实际上你并没有实例化那个类,而是实例化了一个将该类子类化的匿名类。

让我们回到这个问题,接口意味着按字面意思使用。它们应该用作两个组件之间的接口。从软件工程的角度来看,假设您是一个开发大型软件系统的团队,在这种情况下,在设计阶段,您的团队成员应该就标准和全球可接受的界面达成一致,两个组件都是进行互动,并且另外假设这两个中的一个的实现取决于你,而另一个将由你的队友实施,因此为了互操作性,你的代码必须符合该界面,对你的队友也是如此。

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

TL; DR:

你的做法并不好。

答案 1 :(得分:0)

  

所以我可以自由地走这条路吗?

这种方式不太正确。

您所谈论的内容称为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();
    }
    ...
}

听众示例:

如果上述内容对您有点疑惑,请考虑刚刚在Button中初始化的Activity。该按钮充当发布者,而Activity充当订阅者。当用户单击按钮(发布新杂志)时,Activity希望收到通知,因此它使用setOnClickListener()订阅事件,其中传递给方法的View.OnClickListener参数为订阅表格。 Activity(订阅者)填写表单,通过实现接口并覆盖onClick()方法,并将表单传递给方法(subscribe)。发生点击时,Activity会收到通知。