我只是转载我的答案,
在这里。
我经常将业务逻辑代码放在
模型层(不要与数据库中的模型混淆)。我通常重新命名为
XManager
以避免混淆(例如
ProductManager
,
MediaManager
...),因此Presenter类只用于保持工作流程。
经验法则是,在Presenter类中没有或至少限制
导入android包。这种最佳实践支持您更容易地测试Presenter类,因为Presenter现在只是一个普通的Java类,所以我们不需要Android框架来测试这些东西。
例如,这是我的MVP工作流程。
View类:这是存储所有视图(如按钮、TextView等)并在该层上设置所有视图组件的侦听器的位置。在此View上,您为Presenter实现定义了一个Listener类。您的视图组件将调用此侦听器类上的方法。
class ViewImpl implements View {
Button playButton;
ViewListener listener;
public ViewImpl(ViewListener listener) {
this.listener = listener;
playButton.setOnClickListener(new View.OnClickListener() {
listener.playSong();
});
}
public interface ViewListener {
playSong();
}
}
Presenter类:这是您存储视图和模型以供稍后调用的位置。此外,Presenter类将实现上面定义的ViewListener接口。Presenter的主要作用是控制逻辑工作流程。
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();
}
}
管理器类:这里是核心业务逻辑代码。可能一个Presenter会有多个Manager(取决于视图的复杂程度)。通常我们通过一些注入框架(例如Dagger)获取Context
类。
Class MediaManagerImpl extends MediaManager {
@Inject
private Context context;
private MediaPlayer mediaPlayer;
public MediaPlayerManagerImpl() {
this.mediaPlayer = new MediaPlayer(context);
}
public MediaPlayerManagerImpl(Context context) {
this.context = context;
this.mediaPlayer = new MediaPlayer(context);
}
public void playMedia() {
mediaPlayer.play();
}
public void stopMedia() {
mediaPlayer.stop();
}
}
最后: 将这些内容放在Activities、Fragments中...这是您初始化视图、管理器并将所有内容分配给Presenter的地方。
public class MyActivity extends Activity {
Presenter presenter;
@Override
public void onCreate() {
super.onCreate();
IView view = new ViewImpl();
MediaManager manager = new MediaManagerImpl(this.getApplicationContext());
MediaManager manager = new MediaManagerImpl();
presenter = new PresenterImpl(view, manager);
}
@Override
public void onStop() {
super.onStop();
presenter.onStop();
}
}
您可以看到每个 Presenter、Model、View 都被包装在一个接口中。这些组件将通过接口进行调用。这种设计使您的代码更加健壮,并且以后修改起来更容易。