1 服务端的MVC模式
PHP MVC模式的通信图:
以一个图书列表+图书详情的应用为例,文件结构如下:
PHP MVC Controller
负责接收与响应HTTP请求。为了把HTML页面与数据绑定后呈现给用户Client,Controller需要从Model获取数据,从View获取HTML模板。
用户访问网页的入口文件index.php文件,该文件调用Controller的invoke方法。
// index.php file
include_once("controller/Controller.php");
$controller=newController();
$controller->invoke();
Controller的invoke方法:1、从Model获取数据;2、将数据传递给View的HTML模板,然后View把整合数据的模板回传给Controller。
例如,获取图书列表:
$books=$this->model->getBookList();
include 'view/booklist.php';
获取图书详情
$book=$this->model->getBook($_GET['book']);
include 'view/viewbook.php';
下图结合代码调用过程描述了上述过程:
2 Android应用架构的默认模式
Android应用架构默认的模式是什么?如果没有分层的概念,Android的确没有限定的应用架构。
2.1 混沌时期 - V与C的耦合,M仅仅是Data bean
Activity是学习Android最初接触也是最常用最基本的一个组件,仅仅完了完成页面,很多公司一个人开发项目都喜欢在Activity堆了上千行代码。从代码形态看,没有分层,视图加载,网络请求,视图更新都放在同一个Activity,后续维护非常困难。
更详细的过程看参考,你是如何把Activity写的如此“万能”的 :link
在Android实践MVC的缺点:
1、Activity作为Android的页面显示组件,做MVC应用架构中担任Controller Layer,去加载数据,把数据传给View组件,然后显示出来。这使得View与Controller分不清。MVC模式不能在Android中清晰发挥作用。
2、页面交互逻辑复杂时无法清晰实现。
3、数据源结构复杂无法与页面解耦。
4、异步操作时,容易陷入多层回调陷阱。而且,Activity容易被异步组件持有导致Activity内存泄露。
Model层仅仅有Data beans的问题:无法
那么,Android的Activity应该扮演什么角色?
3 Android的其他MVC模式
在Android中有常见的ListView,GridView等一些控件能够很好的体现MVC模式。
3.1 ArrayList-ListView-Adapter
写一个ListView要实现需要以上三种元素,刚好对应MVC模式。
Controller Layer:Adapter,负责获取数据并在getView方法,更新ListView(View Layer)的数据。
Model Layer:ArrayList是一部分,负责存储数据;如果要从网络、数据库获取数据,则获取数据的组件也属于Model Layer。如果要与View Layer做数据绑定,运用观察者模式,在Model Layer添加notify方法,通知Controller,Controller更新View。
View Layer:ListView。
3.1.1 为什么ArrayList-ListView-Adapter是MVC,不是MVP?
因为MVC中的C会输出View,而MVP的P不输出View,只会传递数据给View。Adapter的getView会直接输出View。所以,实践过程中要尽量把V与C解耦,则把getView中的View事件交互封装抽离。 #ListView数据绑定的实践#
3 关于MVP
MVC的变体,通过P解耦M和V。P不负责输出View,仅仅负责业务逻辑,并把数据交给View Layer。
Activity作为纯粹的View,不负责数据加载、业务逻辑。
这次总结到这里,下次总结MVP的实践。
更多关于MVP的资料:
这篇文章对MVC/MVP/MVVM有很多自己的思考,为什么要有这样架构的演变,以及各自的优缺点的思考,很棒!
大部分业务场景一个View对应一个Presenter,但是如果一个界面需要多个View/Presenter或者同一个View有多个实现且使用同一个PresenterView时候,如何来设计Presenter,这篇文章是很好的延伸阅读。
参考资料
Model View Controller(MVC) In PHP Tutorial
Understanding MVC, MVP and MVVM Design Patterns