MVP模式

前言

MVP是一种MVC的变形,相比MVC它大大减少了Activity的责任将主要的逻辑操作集中在Presenter层中,从而使得MVP的代码结构变得更清晰。

MVP结构

MVP主要由Model、View、Presenter三部分构成。
Model:负责数据的处理,即数据的获取、存储、解析、分发、修改等操作;
View:即Activity和Fragment,负责页面的绘制,刷新;
Presenter:负责连接Model层和View层,从Model中获取数据然后控制View刷新页面,是主要逻辑操作的地方。

这里借用此文的一张图片来表示Model、View和Presenter三者的关系
mvp

MVP案例

这是一个简单的菜谱App,主要包括列表和详情,下面以列表页威力展示一下MVP的运用。

列表页视图:
App

项目结构:
object

(1)Model层
这里的Model主要负责从网络获取数据

public interface ITypeListModel {
    void loadList(String url, Map<String,String> paraMap, TypeListListener listener);
    void cancle();

    interface TypeListListener{
        void loadSuccess(String json,Map<String,String> hMap);
        void loadFail(Exception e,Map<String,String> hMap);
    }
}
public class TypeListModel implements ITypeListModel {

    private RequestCall call;

    @Override
    public void loadList(String url, final Map<String, String> paraMap, final ITypeListModel.TypeListListener listener) {
        call= OkHttpUtils.post()
                .url(url)
                .params(paraMap)
                .build();
        call.execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                listener.loadFail(e,paraMap);
            }

            @Override
            public void onResponse(String response, int id) {
                listener.loadSuccess(response,paraMap);
            }
        });
    }

    @Override
    public void cancle() {
        if(call!=null)
            call.cancel();
    }
}

(2)View层
View层管理点击页面上控件的状态和控件的点击事件
我将View和Presenter的两个接口都放在了Contract中方便管理

    interface View{

        void showLoading();

        void hideLoading();

        void showLoadFail();

        void hideLoadFail();

        void showContent();

        void hideContent();

        void toastMessage(String message);

        void setContentData(List<FoodTypeGroup> list);

    }
public class FoodTypeActivity extends AppCompatActivity implements FoodTypeContract.View, View.OnClickListener, ExpandableListView.OnChildClickListener {

    @Bind(R.id.tv_head_back)
    View tvBack;
    @Bind(R.id.tv_head_title)
    TextView tvTitle;
    @Bind(R.id.elv_content)
    ExpandableListView elvContent;
    @Bind(R.id.progressBar)
    View progressBar;
    @Bind(R.id.tv_fail)
    View tvFail;

    private FoodTypeAdapter adapter;
    private List<FoodTypeGroup> adapterList;
    private FoodTypeContract.Presenter foodTypePresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_type);
        ButterKnife.bind(this);
        foodTypePresenter=new FoodTypePresenter(this);
        initView();
        initAdapter();
        foodTypePresenter.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        foodTypePresenter.onDestroy();
    }

    private void initView() {
        tvBack.setVisibility(View.GONE);
        tvTitle.setText("菜品分类");
        tvFail.setOnClickListener(this);
        elvContent.setOnChildClickListener(this);
    }

    private void initAdapter(){
        adapterList=new ArrayList<>();
        adapter=new FoodTypeAdapter(this,adapterList);
        elvContent.setAdapter(adapter);
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.tv_fail://重新加载
                foodTypePresenter.start();
                break;
        }
    }

    @Override
    public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
        Intent intent=new Intent(this,TypeListActivity.class);
        intent.putExtra("id",adapterList.get(i).getList().get(i1).getId());
        intent.putExtra("type",adapterList.get(i).getList().get(i1).getName());
        startActivity(intent);
        return true;
    }

    @Override
    public void showLoading() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void showLoadFail() {
        tvFail.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoadFail() {
        tvFail.setVisibility(View.GONE);
    }

    @Override
    public void showContent() {
        elvContent.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideContent() {
        elvContent.setVisibility(View.GONE);
    }

    @Override
    public void toastMessage(String message){
        ToastUtil.showToast(this,message);
    }

    @Override
    public void setContentData(List<FoodTypeGroup> list) {
        adapterList.clear();
        adapterList.addAll(list);
        adapter.notifyDataSetChanged();
    }
}

(3)Presenter层
从View中接收到获取列表请求后调用Model获取列表数据,根据列表数据的状态控制View作不同的显示

    interface Presenter extends BasePresenter{
        @Override
        void start();

        @Override
        void onDestroy();
    }
public class FoodTypePresenter implements FoodTypeContract.Presenter{
    private FoodTypeContract.View foodTypeView;
    private IFoodTypeModel iFoodTypeModel;
    public FoodTypePresenter(FoodTypeContract.View foodTypeView){
        this.foodTypeView=foodTypeView;
        iFoodTypeModel=new FoodTypeModel();
    }

    @Override
    public void start() {
        foodTypeView.hideContent();
        foodTypeView.hideLoadFail();
        foodTypeView.showLoading();
        final Map<String,String> paraMap=new HashMap<>();
        paraMap.put("key",BaseUrl.KEY);
        iFoodTypeModel.loadList(BaseUrl.FOODTYPE, paraMap, new IFoodTypeModel.FoodTypeListener() {
            @Override
            public void loadSuccess(String json) {
                LoadSuccess.onSuccess(json, new LoadSuccess.LoadSuccessCallBack() {
                    @Override
                    public void code200(JSONObject json) throws JSONException {
                        if(foodTypeView!=null) {
                            List<FoodTypeGroup> list = JSON.parseArray(json.getJSONArray("result").toString(), FoodTypeGroup.class);
                            foodTypeView.hideLoading();
                            foodTypeView.showContent();
                            foodTypeView.setContentData(list);
                        }
                    }
                    @Override
                    public void codeOther(String errorMessage) {
                        if(foodTypeView!=null) {
                            foodTypeView.hideLoading();
                            foodTypeView.showLoadFail();
                            foodTypeView.toastMessage(errorMessage);
                        }
                    }
                });
            }

            @Override
            public void loadFail(Exception e) {
                L.e("NET",e.getMessage());
                if (foodTypeView!=null) {
                    foodTypeView.hideLoading();
                    foodTypeView.showLoadFail();
                    foodTypeView.toastMessage("网络连接异常");
                }
            }
        });
    }

    @Override
    public void onDestroy(){
        iFoodTypeModel.cancle();
        foodTypeView=null;
    }

}

项目地址

https://github.com/NevLight/Fish

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值