MVP框架思想和小案例实现

思路:

不多说了,就是 m 不可以和v直接交互,通过中间的p

实现步骤

1.UI逻辑抽象为接口

2.业务逻辑抽象为接口
Activity /其他view  就是View层 只负责UI 
Persenter   是业务层  负责逻辑 或数据获取
(后缀Impl代表对应的实现类)

代码演示:

Activity 或者普通view 把ui逻辑抽象为接口文件:

FlashSaleMVPView.java 接口文件

/**
 * Created by cuizehui on 17-10-13.
 * 抢购界面 UI逻辑
 */

public interface FlashSaleMVPView {
    public void reupRepositories(ArrayList<FlashPruductData> repositories);

    public MainActivity getMainActivity();
}

实现类:

FlashSaleView.java

注意到这里含有persenterImpl 类的引用对象。
当需要业务逻辑时,则调用PersenterIml 类中的方法 执行业务逻辑
/**
 * Created by cuizehui on 17-9-14.
 * 抢购界面
 */

public class FlashSaleView extends  BasePagerView implements FlashSaleMVPView{
    FlashSalePresenterImpl flashSalePresenter;

    private RecyclerView recyclerView;
    private FlashSaleRecycleViewAdapter flashSaleRecycleViewAdapter;

    public FlashSaleView(MainActivity mainActivity) {
        super(mainActivity);

    }


    /***
     * mvp模式下 这个类中 不存在这个方法
     */
    @Override
    protected void initDate() {
        super.initDate();
    }

    @Override
    protected void initView() {
        super.initView();

        //获取引用 并将自己绑定给 presenter
        flashSalePresenter=new FlashSalePresenterImpl();
        flashSalePresenter.attachView(this);

        basePager_fl.removeAllViews();
        LayoutInflater inflater =LayoutInflater.from(mainActivity);

        View shopview=inflater.inflate(R.layout.main_viewpager_shop,null);
        recyclerView=shopview.findViewById(R.id.flash_sale_rv);
        setupRecyclerView(recyclerView);
        //获取数据 并刷新ui(方法还是在这个类中)
        flashSalePresenter.loadRepositories();



        basePager_fl.addView(shopview);






    }



    @Override
    protected void initEvent() {
        super.initEvent();
    }


    private void setupRecyclerView(RecyclerView recyclerView) {
         flashSaleRecycleViewAdapter=new FlashSaleRecycleViewAdapter();

        flashSaleRecycleViewAdapter.setItemClickCallback(new FlashSaleRecycleViewAdapter.ItemClickCallback() {
            @Override
            public void onItemClick(FlashPruductData flashPruductData) {
                flashSalePresenter.jumptoflashSaleProductActivity(flashPruductData);
            }
        });

        recyclerView.setAdapter(flashSaleRecycleViewAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
    }


    @Override
    public void reupRepositories(ArrayList<FlashPruductData> repositories) {
        //获取同一个??!!!
        Log.d("刷新UI","start");
        FlashSaleRecycleViewAdapter adapter= (FlashSaleRecycleViewAdapter) recyclerView.getAdapter();
        adapter.setFlashSalerepositories(repositories);
        adapter.notifyDataSetChanged();
    }

    @Override
    public MainActivity getMainActivity() {
        return mainActivity;
    }
}


业务逻辑抽象成接口:

FlashSalerPresenter.java 接口
public interface FlashSalePresenter {


    public void attachView(FlashSaleMVPView view) ;

    public void detachView() ;

    /***
     * 加载网络数据
     *
     */
    public void loadRepositories() ;

    /**
     * 跳转至flashSaleProductActivity
     */
    public void jumptoflashSaleProductActivity(FlashPruductData flashPruductData);

}

FlashSalerPresenterImpl.java 实现类

可以看到这里同样获取了 view 的引用, 当业务逻辑执行完毕后,需要调用UI 方法时 ,调用FlashSaleView 接口中的方法更新UI
 
public class FlashSalePresenterImpl implements  FlashSalePresenter {

  public FlashSaleMVPView flashSaleMVPView;
    @Override
    public void attachView(FlashSaleMVPView view) {
       this.flashSaleMVPView=view;
    }

    @Override
    public void detachView() {
        this.flashSaleMVPView= null;
    }


    /**
     * 获取抢购 数据Arraylist
     */
    @Override
    public void loadRepositories() {
        ArrayList<FlashPruductData> list=new ArrayList<>();
        FlashPruductData flashPruductData1=new FlashPruductData();
        flashPruductData1.setProductname("抢购商品1");
        flashPruductData1.setStartData("上午11点");
        flashPruductData1.setOldprice("100");
        flashPruductData1.setFlashprice("20");
        FlashPruductData flashPruductData2=new FlashPruductData();
        flashPruductData2.setProductname("抢购商品2");
        flashPruductData2.setOldprice("200");
        flashPruductData2.setFlashprice("20");

        FlashPruductData flashPruductData3=new FlashPruductData();
        flashPruductData3.setProductname("抢购商品3");
        flashPruductData3.setStartData("上午11点");
        flashPruductData3.setOldprice("300");
        flashPruductData3.setFlashprice("20");
        FlashPruductData flashPruductData4=new FlashPruductData();
        flashPruductData4.setProductname("抢购商品4");
        flashPruductData4.setOldprice("400");
        flashPruductData4.setFlashprice("20");


        FlashPruductData flashPruductData5=new FlashPruductData();

        list.add(flashPruductData1);
        list.add(flashPruductData2);
        list.add(flashPruductData3);
        list.add(flashPruductData4);
        list.add(flashPruductData5);
        flashSaleMVPView.reupRepositories(list);


    }

    /**
     * 跳转至flashSaleProductActivity
     */
    @Override
    public void jumptoflashSaleProductActivity(FlashPruductData flashPruductData) {

        Log.d("jumpto flash ","start");
        Intent intent=new Intent(flashSaleMVPView.getMainActivity(),FlashSaleProductActivity.class);

        flashSaleMVPView.getMainActivity().startActivity(intent);
    }


}

待优化部分:

这种代码结构适合中型项目, 因为 这样会产生很多的接口类 和实现类。

将业务逻辑和UI逻辑彻底分离,同时可以将 modle 层注入到persenter 层 实现解耦.

优化部分:可以 抽取UI逻辑和view 逻辑的公共逻辑提取成父类或抽象类 等等。 泛型的抽取


具体源码可以在项目中查找:

https://github.com/cuizehui/Estore

或者查看此经典案例:

https://github.com/ivacf/archi



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值