2016-01-10 64 views
1

我读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 
     } 
    } 
} 

,我觉得这种方式更容易阅读和理解,但不知道这是一个不好的做法与否。那么我可以随意进一步走这条路吗?

+0

刚才发现我在这种情况下甚至不需要接口。所以在我看来,这是做回调的不好的方法( – kolyaseg

+0

_“刚刚发现我在这种情况下甚至不需要接口。”)_在这种情况下,您可以使用NONE类实例,而是使用'Helper'实例以通知MainClass中发生的完成/失败操作,这会使这些类紧密耦合在一起,你的代码变得更加灵活和难以维护,相反,通过使用'Observer'模式,你可以使用任何实现类的实现'IHelper'接口,这使得类间松散耦合,代码看起来更加灵活。 – Onik

回答

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(); 
    } 
    ... 
} 

甲听者例如:

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

1

在我看来,这不是一个好的编程方式。通常你甚至不需要接口来实现这样的设计,你可以在实例化时重写每个类的方法。实际上,你并没有实例化这个类,而是实例化一个匿名类,它将这个类继承下来。

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

就你而言,你实际上是在将标准接口合并到你自己的组件中,所以你的队友可能会对此感到不满。

TL; DR:

您的方法不好。

相关问题