一个好的软件,好的架构是基石,好的技术是关键。架构就像盖房子时下的地基一样,房子稳不稳取决于地基,而我们的软件好不好拓展,好不好维护,取决的便是我们软件的架构。采用架构时,没有特定的约束,按需采用,也可以自己根据开发经验总结提炼出好的架构。
业内比较常见的架构有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)) {