我只是在这里重新发布我的答案
我经常将业务逻辑代码放在模型层中 (不要与数据库中的模型混淆)。 我经常将其重命名为XManager以避免混淆(例如ProductManager , MediaManager …),因此演示者类仅用于保持工作流程。
经验法则是没有或至少限制在演示者类中导入android包 。 这个最佳实践支持您更轻松地测试presenter类,因为presenter现在只是一个普通的java类,所以我们不需要android框架来测试这些东西。
例如,这是我的mvp工作流程。
视图类 :这是一个存储所有视图的地方,例如按钮,textview ……并且您可以在此图层上为这些视图组件设置所有侦听器。 同样在此视图上,您可以稍后为演示者实现定义一个Listener类。 您的视图组件将调用此侦听器类上的方法。
class ViewImpl implements View { Button playButton; ViewListener listener; public ViewImpl(ViewListener listener) { // find all view this.listener = listener; playButton.setOnClickListener(new View.OnClickListener() { listener.playSong(); }); } public interface ViewListener { playSong(); } }
Presenter类:这是您在其中存储视图和模型以便稍后调用的地方。 另外presenter类将实现上面定义的ViewListener接口。 演示者的要点是控制逻辑工作流程。
class PresenterImpl extends Presenter implements ViewListener { private View view; private MediaManager mediaManager; public PresenterImpl(View, MediaManager manager) { this.view = view; this.manager = manager; } @Override public void playSong() { mediaManager.playMedia(); } }
Manager类:这是核心业务逻辑代码。 也许一位主持人会有很多经理(取决于观点的复杂程度)。 通常我们通过一些注入框架(如Dagger获取Context类。
Class MediaManagerImpl extends MediaManager { // using Dagger for injection context if you want @Inject private Context context; private MediaPlayer mediaPlayer; // dagger solution public MediaPlayerManagerImpl() { this.mediaPlayer = new MediaPlayer(context); } // no dagger solution public MediaPlayerManagerImpl(Context context) { this.context = context; this.mediaPlayer = new MediaPlayer(context); } public void playMedia() { mediaPlayer.play(); } public void stopMedia() { mediaPlayer.stop(); } }
最后:将这些内容放在“活动”,“碎片”中……这是您初始化视图,管理器并将所有内容分配给演示者的位置。
public class MyActivity extends Activity { Presenter presenter; @Override public void onCreate() { super.onCreate(); IView view = new ViewImpl(); MediaManager manager = new MediaManagerImpl(this.getApplicationContext()); // or this. if you use Dagger MediaManager manager = new MediaManagerImpl(); presenter = new PresenterImpl(view, manager); } @Override public void onStop() { super.onStop(); presenter.onStop(); } }
您会看到每个演示者,模型,视图都由一个界面包装。 这些组件将通过接口调用。 此设计将使您的代码更加健壮,以后更容易修改。