专业 靠谱 的软件外包伙伴

您的位置:首页 > 新闻动态 > 软件开发架构——MVP初体验

软件开发架构——MVP初体验

2016-08-29 16:28:05

1、什么是MVP?

MVP:一种架构模式,简言之就是一种软件开发的规则。包括Model层、View层、Presenter层。 
View层:负责处理用户事件和视图部分的展示。Activity、Fragment。 
Model层:负责访问数据,获取数据,数据实体类。数据包括后台数据、本地数据。 
Presenter层:连接View和Model的桥梁。 

这里写图片描述 

(此图来自互联网,若作者不同意,会及时替换)

 

MVP的优势?

  • View层和Model层的完全解耦合
  • 减小臃肿代码,提高代码可维护性
  • 方便单元测试

2、MVP初体验

Model层

/**
 * Created by magic on 2016年8月7日.
 */
public class User {

    String name;
    int age;

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }

}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

契约接口

/**
 * Created by magic on 2016年8月7日.契约接口 方便查看view层和Presenter层逻辑关系
 */
public interface UserContract {

    interface View extends BaseView<Presenter> {
        // 隐藏加载框
        void showProgressDialog();
        // 隐藏加载框
        void dismissProgressDialog();
        // 显示数据
        void showUser(List<User> list);
        // 关闭下拉刷新
        void closePullDownRefurbish();
    }

    interface Presenter extends BasePresenter {
        // 加载数据
        void loadUser(boolean isFirst);
    }
}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

该接口主要将View层接口和Presenter层接口封装在一块方便统一查看和统一调度。其中BaseView、BasePresenter 又分别是View层级和Presenter层级的基类接口。

/**
 * Created by magic on 2016年8月7日. view层抽象基类
 */
public interface BaseView<T> {
    // 设置Presenter
    void setPresenter(T presenter);
}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
/**
 * Created by magic on 2016年8月7日.Presenter层抽象基类
 */
public interface BasePresenter {
    // 设置统一初始化方法
    void start();
}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Presenter层

/**
 * Created by magic on 2016年8月7日.Presenter层
 */
public class UserPresenter implements UserContract.Presenter {

    private UserContract.View view;

    public UserPresenter(View view) {
        super();
        this.view = view;
        view.setPresenter(this);
    }

    @Override
    public void start() {
        loadUser(true);
    }

    @Override
    public void loadUser(final boolean isFirst) {
        // 处理获取数据逻辑
        if (isFirst) {
            view.showProgressDialog();
        }
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                //该部分可放在Model层处理
                List<User> list = new ArrayList<User>();
                for (int i = 0; i < 5; i++) {
                    list.add(new User("MAGIC" + i, 20));
                }
                view.showUser(list);
                if (isFirst) {
                    view.dismissProgressDialog();
                } else {
                    view.closePullDownRefurbish();
                }
            }
        }, 3000);
    }

}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

View层将业务逻辑委托给UserPresenter处理,UserPresenter通过Model层获取数据并处理相关逻辑,然后通过View层的接口回调通知界面刷新。  UserPresenter 实现契约类中的UserContract.Presenter接口并通过构造方法将UserContract.View接口对象传递进来并调用它的setPresenter()方法。

View层

/**
 * Created by magic on 2016年8月7日. View层
 */
public class MainActivity extends Activity implements UserContract.View {

    //自定义下拉刷新的listview
    PullDownRefurbishListView listView;
    ProgressDialog dialog;

    List<User> list = new ArrayList<User>();
    MyAdapter adapter;

    UserContract.Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        listView = (PullDownRefurbishListView) findViewById(R.id.listview);
        dialog = new ProgressDialog(this, ProgressDialog.STYLE_HORIZONTAL);
        adapter = new MyAdapter(this, list);
        listView.setAdapter(adapter);

        listView.setIPullDownRefurbish(new PullDownRefurbishListView.IPullDownRefurbish() {

            @Override
            public void refurbish() {
                // 下拉刷新处理
                presenter.loadUser(false);
            }
        });

        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(
                        MainActivity.this,
                        "name:" + adapter.getItem(position - 1).getName()
                                + "   age:"
                                + adapter.getItem(position - 1).getAge(),
                        Toast.LENGTH_SHORT).show();
            }
        });

        new UserPresenter(this);
        presenter.start();

    }

    @Override
    public void setPresenter(Presenter presenter) {
        this.presenter = presenter;
    }

    @Override
    public void showProgressDialog() {
        dialog.show();
    }

    @Override
    public void dismissProgressDialog() {
        dialog.dismiss();
    }

    @Override
    public void showUser(List<User> list) {
        this.list.addAll(list);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void closePullDownRefurbish() {
        // 关闭下拉刷新
        listView.setPullDownRefurbishFinish();
    }

}
  • 		1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

MainActivity实现契约类中的UserContract.View接口,通过 UserContract.Presenter 接口对象调用相关方法,改变View的显示内容。

关于:中科研拓
深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供很好的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com


  上一篇   [返回首页] [打印] [返回上页]   下一篇