MVP模式探讨

来源:互联网 发布:淘宝号贷款怎么贷款 编辑:程序博客网 时间:2024/06/04 17:59

先从字面意义上来了解MVP
M——Model 模型
V——View 视图
P——Presenter 呈献者
*这里的View不是Android 组件,而是MVP模式的一部分

  • 从Android控件方面来说,View部分都是一些Fragment以及View,其中不包括数据、逻辑,只做单纯的显示,这样大大地简化了View的代码量,而且与Model完全解耦。**The view contains almost no logic: it converts the presenter’s commands to UI actions and listens to user actions, which are passed to the presenter。**View部分不含逻辑,主要作用是将Presenter中的代码命令转化成界面行为,并且监听用户操作并将此操作传递到Presenter层进行逻辑处理。View和Presenter之间用接口来联系。

  • 这里的P主要将V呈现在大家面前。为了把View和Model测底隔开,以往View中的数据变更等代码都放到了Presenter中,因此该模块中的代码就显得比较拥挤。基本业务逻辑也是存放在Presenter中。
    这里写图片描述

接下来分析google提供的TODOAPP代码
先定义View和Presenter的基类

public interface BaseView<T> {    void setPresenter(T presenter);}
public interface BasePresenter {    void start();}

TasksContract类用来联系二者。

public interface TasksContract {    interface View extends BaseView<Presenter> {    ...    }    interface Presenter extends BasePresenter{    ...    }}

具体的View继承自Fragment并且实现了TaskContract.View接口

public class TasksFragment extends Fragment implements TasksContract.View {    private TasksContract.Presenter mPresenter;    private TasksAdapter mListAdapter;    private View mNoTasksView;    private ImageView mNoTaskIcon;    private TextView mNoTaskMainView;    private TextView mNoTaskAddView;    private LinearLayout mTasksView;    private TextView mFilteringLabelView;    ...        public TasksFragment() {        // Requires empty public constructor    }    public static TasksFragment newInstance() {        return new TasksFragment();    }    ...    @Override    public void setPresenter(@NonNull TasksContract.Presenter presenter) {        mPresenter = checkNotNull(presenter);    }    ...}

具体的Presenter实现了TaskContract.Presenter接口

public class TasksPresenter implements TasksContract.Presenter {    private final TasksRepository mTasksRepository;    private final TasksContract.View mTasksView;    private TasksFilterType mCurrentFiltering = TasksFilterType.ALL_TASKS;    private boolean mFirstLoad = true;    public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");        mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");        mTasksView.setPresenter(this);    }    ...    @Override    public void start() {        loadTasks(false);    }    ...    //实例化之后,一旦显示,立即执行start()方法    @Override    public void onResume() {        super.onResume();        mPresenter.start();    }}

Activity中的相关代码

public class TasksActivity extends AppCompatActivity {    private static final String CURRENT_FILTERING_KEY = "CURRENT_FILTERING_KEY";    private DrawerLayout mDrawerLayout;    private TasksPresenter mTasksPresenter;    ...    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.tasks_act);        ...        //实例化TasksFragment        ...        //实例化TasksPresenter,内部开始运行start()方法    } }
0 0
原创粉丝点击