MVP架构模式
来源:互联网 发布:mac版spss 如何安装 编辑:程序博客网 时间:2024/06/05 17:43
什么是MVP架构
MVP(Model-View-Presenter)是从经典的模式MVC演变而来的,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
MVP架构:
View: 对应于Activity,负责View的绘制以及与用户交互
Model: 依然是业务逻辑和实体模型
Presenter: 负责完成View于Model间的交互
View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。
Presenter与View的交互是通过接口来进行的。
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。
MVP架构模式的简单实践
Version实体类:
public class Version implements Serializable{ //是否有新版本 private String hasNewVersion; //新版本名 private String versionName; //最新版本号 private String versionCode; public void setHasNewVersion(String hasNewVersion) { this.hasNewVersion = hasNewVersion; } public String getHasNewVersion() { return hasNewVersion; } public String getVersionName() { return versionName; } public void setVersionName(String versionName) { this.versionName = versionName; } public String getVersionCode() { return versionCode; } public void setVersionCode(String versionCode) { this.versionCode = versionCode; }}
主界面有两个TextView,一个用于显示版本名,一个用于显示版本号,还有一个按钮,点击按钮会触发请求,代码如下:
public class MvpActivity extends AppCompatActivity implements VersionView { private TextView versionName; private TextView versionCode; private VersionPresenter mVersionPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvp); versionName = (TextView) findViewById(R.id.version_name); versionCode = (TextView) findViewById(R.id.version_code); mVersionPresenter = VersionPresenter.getInstance(this); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mVersionPresenter.getNewVersion(getApplicationContext(), "local-url"); } }); } @Override public void showVersionNameAndDesc(Version version) { versionName.setText("最新版本名:" + version.getVersionName()); versionCode.setText("最新版本号:" + version.getVersionCode()); } @Override public void showToast(String msg) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); }}
该Activity实现了VersionView接口,这就是mvp中的view层,用于跟用户交互,显示数据。我们可以看到VersionPresenter的初始化,VersionPresenter属于presenter层,用于处理view与model层的通信,不让view直接操作model,可见用户点击按钮后,就通知VersionPresenter去获取版本信息,至于如何获取版本信息,presenter层会交给对应的model去进行处理,下面是VersionPresenter的代码:
public class VersionPresenter extends IPresenter { private static VersionPresenter mVersionPresenter; private VersionModel mVersionModel; private VersionView mVersionView; private VersionPresenter(IView view){ this.mVersionView = (VersionView) view; this.mVersionModel = new VersionModel(); } public static VersionPresenter getInstance(VersionView view){ if (mVersionPresenter == null){ synchronized (VersionPresenter.class){ if (mVersionPresenter == null){ mVersionPresenter = new VersionPresenter(view); } } } return mVersionPresenter; } //获取版本信息 public void getNewVersion(final Context context, String url){ mVersionModel.getNewVersion(url, new VersionModel.VersionCallback() { @Override public void onVersionCallback(final Version version) { ((Activity)context).runOnUiThread(new Runnable() { @Override public void run() { mVersionView.showVersionNameAndDesc(version); if (version.getHasNewVersion().equals("true")){ mVersionView.showToast("App有新版本,请更新"); } } }); } }); }}
用户通知presenter后,presenter就把view的需求通知model层,数据操作交给model层去做具体实现,可以见到在VersionPresenter的getNewVersion方法中只是把view传过来的参数给到model,具体的网络请求交给VersionModel去实现,下面是VersionModel的具体实现:
public class VersionModel implements IModel { public interface VersionCallback { void onVersionCallback(Version version); } private HttpURLConnection httpURLConnection = null; private InputStream inputStream = null; private BufferedReader bufferedReader = null; public void getNewVersion(final String url, final VersionCallback versionCallback) { new Thread(new Runnable() { @Override public void run() { try { httpURLConnection = (HttpURLConnection) new URL(url).openConnection(); httpURLConnection.connect(); inputStream = httpURLConnection.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); StringBuilder stringBuilder = new StringBuilder(); String tempLine = null; while ((tempLine = bufferedReader.readLine()) != null) { stringBuilder.append(tempLine).append("\n"); } String data = stringBuilder.toString(); Log.e("data", data); JSONObject jsonObject; jsonObject = new JSONObject(data); Version version=new Version(); version.setHasNewVersion("has_new_version"); version.setVersionCode(jsonObject.optString("version_code")); version.setVersionName(jsonObject.optString("version_name")); versionCallback.onVersionCallback(version); } catch (Exception e) { e.printStackTrace(); } finally { try { bufferedReader.close(); inputStream.close(); } catch (Exception e) { } } } }).start(); }}
VersionModel去执行网络请求,获取到VersonView需要的数据然后回调到VersionPresenter,再由VersionPresenter通知VersonView去做UI的变化或者其他一些操作。纵观整个过程可以发现,view层和model层没有一丝耦合,这就是mvp架构模式的初衷,做到了松耦合,view,model,presenter每一层负责自身的工作,绝不越界。
- MVP架构模式详解
- MVP架构模式
- android-MVP架构模式
- mvp架构模式
- mvp架构模式
- MVP架构模式
- 细谈MVP架构模式
- Android|MVP架构模式
- MVP应用架构模式
- MVP架构模式
- 浅谈mvp架构模式
- MVP应用架构模式
- MVP架构模式详解
- Android架构:MVP模式实例
- Android MVP 架构模式详解
- 架构模式 -- MVC、MVP、MVVM
- 浅谈架构模式-mvc,mvp
- 架构模式:MVC,MVP&MVVM
- 清除缓存
- java--swin--自定义弹框示例
- MySQL的查询语句EXPLAIN分析
- Java泛型详解,通俗易懂的写法
- C#语法糖(Csharp Syntactic sugar)大汇总
- MVP架构模式
- 第4章 依赖属性(4)——属性验证
- ArcEngine标注显示比率
- [LeetCode] 398. Random Pick Index
- Mybatis使用generator自动生成映射配置文件信息
- 关于s7 300的中值滤波
- ZooKeeper之(五)集群管理
- baso
- Spring MVC 教程,快速入门,深入分析