MVP开发架构详解

本文详细介绍了MVP架构的原理与实现,通过点外卖下单的业务场景展示了MVP的三层结构:Model、View、Presenter。代码示例中,契约接口Contract作为核心,规定了各层职责。同时,讨论了MVP的缺点,如接口过多导致复杂性增加、维护成本提高和回调链可能引发的内存泄漏问题,并提出了相应的优化策略。
摘要由CSDN通过智能技术生成

一个好的软件,好的架构是基石,好的技术是关键。架构就像盖房子时下的地基一样,房子稳不稳取决于地基,而我们的软件好不好拓展,好不好维护,取决的便是我们软件的架构。采用架构时,没有特定的约束,按需采用,也可以自己根据开发经验总结提炼出好的架构。
业内比较常见的架构有MVC、MVP、MVVM等。MVC主要是分Model(模型)-View(视图)- Controller(控制)三个层,控制层来接收交互请求并通过协调模型和视图层对交互进行反馈,是web开发领域比较常用的架构模式。而MVP则是分为Model(模型)- View(视图)- Presenter(presenter)三个层,在MVP中,Presenter的职责主要是负责业务逻辑的处理的,View层来接收用户交互和展示结果,Model层负责模型操作与维护。MVVM模式主要分Model(模型)- View(视图)- ViewModel(视图模型)三个层,在MVVM中,ViewModel层仅专注于业务逻辑的处理,处理过程中如果Model层的某某数据有了变更,View层会动态刷新某某数据所对应的视图展示。而此文主要是介绍MVP开发架构。
话不多说,先上代码,以下为具体的MVP模式实现方式(PS:具体例子以点外卖下单为业务场景,用Java语言编写,模式只介绍截止本文编写日期为止最新的演进结果):

package com.chris.mvpdemo.base;

/**
 * base
 * Created by chris on 2017/11/16.
 */
public interface BasePresenter {
   
    void onCreate();

    void onDestroy();

    void action(int actionCode, Object... actionArgs);

    //.......
}
package com.chris.mvpdemo.base;

import android.support.annotation.StringRes;

/**
 * base
 * Created by chris on 2017/11/16.
 */
public interface BaseView<T> {
    void setPresenter(T presenter);

    void showMessage(String msg);

    void showMessage(@StringRes int msgResId);

    //.....
}

以上为base接口,制定了基本的行为。接着看:

package com.chris.mvpdemo.contract;


import com.chris.mvpdemo.base.BasePresenter;
import com.chris.mvpdemo.base.BaseView;
import com.chris.mvpdemo.model.ProductEntity;

import java.util.List;

/**
 * 下单的Contract
 * Created by chris on 2017/11/16.
 */
public interface OrderContract {
   
    interface View extends BaseView<Presenter> {
        /**
         * 刷新购物车
         */
        void refreshShoppingCart(List<ProductEntity> productEntities);
    }

    interface Presenter extends BasePresenter {
        /**
         * 添加商品
         * {@link BasePresenter#action(int, Object...)}
         */
        int ACTION_CODE_ADD_PRODUCT = 3;
        /**
         * 移除商品
         * {@link BasePresenter#action(int, Object...)}
         */
        int ACTION_CODE_REMOVE_PRODUCT = 4;

        /**
         * 操作商品
         */
        void clearShoppingCart();

        /**
         * 重置(恢复初始化状态)
         */
        void reset();
    }
}

上面是Contract接口,也就是契约接口,是MVP架构的核心接口,规约了Model-View-Presenter三个层的所有行为与能力。接着看:

package com.chris.mvpdemo.presenter;


import android.content.Context;
import android.text.TextUtils;

import com.chirs.mvpdemo.R;
import com.chris.mvpdemo.App;
import com.chris.mvpdemo.callback.ShoppingCartCallback;
import com.chris.mvpdemo.contract.OrderContract;
import com.chris.mvpdemo.model.ProductEntity;
import com.chris.mvpdemo.model.ShoppingCartProcessor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 下单的presenter
 * Created by chris on 2017/11/16.
 */
public class OrderPresenter implements OrderContract.Presenter, ShoppingCartCallback {
   

    private OrderContract.View view;
    private Context context;

    public OrderPresenter(Context context, OrderContract.View view) {
        this.context = context;
        this.view = view;
        view.setPresenter(this);
    }

    @Override
    public void onCreate() {
        ShoppingCartProcessor.getInstance().registerCallback(this);
    }

    @Override
    public void action(int actionCode, Object... actionArgs) {
        switch (actionCode) {
            default:
                break;
            case OrderContract.Presenter.ACTION_CODE_ADD_PRODUCT: {
                if (actionArgs == null || actionArgs.length < 2 || !(actionArgs[0] instanceof ProductEntity) || !(actionArgs[1] instanceof BigDecimal)) {
                    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值