MVC模式简单介绍
模型-视图-控件(model-View-Controller)MVC结构是一种开发模块的方法,它将数据存储和数据处理从数据的可视化表示中分离出来。存储和处理数据的组件称为模型,它包括模块的实际内容。表示数据的组件称为视图,它处理模块全部必要的行为,完毕模块的全部显示。控件一般是一种用来获取数据的组件。
把模块分解成模型与视图有两个明显长处:
1.能够使用多个视图共享同一个模型数据。
2.能够简化复杂应用程序的编写,使用模块具有可伸缩性,而且易于维护。能够改动视图但不会影响模型,反之亦然。
使用MVC最重的一点是,因模型包包括数据,视图显示数据,所以一旦一个视图与模型建立联系,它一定要与该模型同步。
模型数据改变了通知视图,视图接受通知,更新受影响的视图区域。
这里能够使用前面一篇文章介绍的观察者模式实现,假设读者者对java 事件托付模型了解的话也能够使用这样的方式去实现。
MVC另一种变体就是将控件和视图结合在一起。在这样的情况下,视图不仅显示数据,也作为接口和用户进行交互,接受用户的输入。例如以下图所看到的:
这样的变体模式,如是读者做ios开发,应该对种变体模式非常了解的, IOS应用架构就是遵循这样的变体MVC。
以下呈上一个这个种变体模式Demo,模型通知视图更新这一步,是用java 事件托付模型实现,在这里为了兼顾有些读者对这这个模型不了解,就简单的介绍下:
事件源对象触发一个事件,对此事件感兴趣的对象会处理它,对此事件感兴趣的对象称为监听器,意思是把事件托付给监听器处理。
view组件
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View; public class CircleView extends View implements ActionListener {
private CircleModel model; public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} public CircleModel getModel() {
return model;
} public void setModel(CircleModel model) {
this.model = model;
if (model != null) {
model.addActionListener(this);
invalidate();
}
} @Override
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
invalidate();
} @Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub super.draw(canvas);
if (model == null) {
return;
}
int width = getWidth();
int height = getHeight();
Paint paint = new Paint();
canvas.drawCircle(width / 2, height / 2, (float)model.getRadius(), paint);
}
}
model组件
package com.example.learn;
import java.util.ArrayList;
public class CircleModel {
private static final int DEFAULT_RADIUS = 20;
private double radius = DEFAULT_RADIUS;
private ArrayList<ActionListener> actionListeners;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
processEvent(new ActionEvent(this, ActionEvent.UPDATE, "radius"));
}
public void addActionListener(ActionListener listener) {
if (actionListeners == null) {
actionListeners = new ArrayList<ActionListener>();
}
actionListeners.add(listener);
}
public void removeActionListener(ActionListener listener) {
if(actionListeners != null && actionListeners.contains(listener)) {
actionListeners.remove(listener);
}
}
private void processEvent(ActionEvent event) {
ArrayList list = null;
synchronized (this) {
if(actionListeners == null) {
return;
}
list = (ArrayList) actionListeners.clone();
}
for(int i = 0; i < list.size(); i++) {
ActionListener listener = (ActionListener) list.get(i);
listener.actionPerformed(event);
}
}
}
class ActionEvent {
public static final byte UPDATE = 0x01;
public ActionEvent(Object source, byte type, String eventDesc) {
}
}
interface ActionListener {
public void actionPerformed(ActionEvent event);
}
controller组件
package com.example.learn; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText; public class CircleController extends Activity {
private CircleModel model;
private CircleView view;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (CircleView) findViewById(R.id.circle_view);
model = new CircleModel();
model.addActionListener(view);
view.setModel(model);
View setRadius = findViewById(R.id.radius_bn);
final EditText radiusEt = (EditText) findViewById(R.id.radius_et);
setRadius.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
double radius = Double.parseDouble(radiusEt.getText().toString());
model.setRadius(radius);
}
});
}
}
MVC模式简单介绍的更多相关文章
- MVC模式的介绍(C#)
MVC模式的介绍(C#) Benefits在开发项目中使用“模型-视图-控制器(MVC)”模式的好处在于可以完全消除商业流程和应用表达层之间的相互影响.此外,还可以获得一个完全独立的对象来控制表达 ...
- 转载 mvc:message-converters简单介绍 https://www.cnblogs.com/liaojie970/p/7736098.html
mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...
- ASP.NET,什么是MVC,MVC的简单介绍
什么是MVC模式 MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Co ...
- 基于jsp+servlet+javabean的MVC模式简单应用
原先写在CSDN的一篇,我直接扒过来吧.之前打算在CSDN的,结果写了几回,发现他那个发布系统简直烂到家,经常丢失图片各种.所以很长一段时间我也没写什么. 一.MVC模式 1.M : javabea ...
- MVC的开发模式简单介绍
MVCM model 模型 实体类和业务和dao dao(数据库访问对象)V view 视图 jspC controller 控制器 servlet 作用:视图和逻辑分离 开发设计顺序 1.设计数据库 ...
- C# MVC分页简单介绍
ASP.NET MVC中进行分页的方式有多种,这里介绍一种简单实用的方法 一:在实现分页之前,先添加“PagedList”和“PagedList.Mvc”两个组件,具体下载直接在NuGet程序包里收索 ...
- android MVP模式简单介绍
原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...
- Android MVP模式简单介绍:以一个登陆流程为例
老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...
随机推荐
- C#实现自己主动升级(附源代码)
对于PC桌面应用程序而言,自己主动升级功能往往是不可缺少的. 而自己主动升级能够作为一个独立的C/S系统来开发,这样,就能够在不同的桌面应用中进行复用.本文将着重介绍OAUS的相关背景. ...
- SetForegroundWindow
SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. ...
- 小米笔记本(13.3 I7) ubuntu14.04下网卡驱动安装
ubuntu 内核升级到4.6.4(更高版本可能造成系统无法启动) kernel debian包下载地址 http://kernel.ubuntu.com/~kernel-ppa/mainline/v ...
- linux的任务计划 定时任务 计划任务
例如要定时访问一个指定的url 先看看系统有没有crontab
- Node.js日志框架选型比較:Bunyan
前一篇Node.js日志框架选型比較:Winston Bunyan Bunyan(by Trent Mick)是另外一个值得考虑的日志框架,以稍微不同的方式处理结构化,机器可读性被重点对待. 其结果是 ...
- [JS Compse] 4. A collection of Either examples compared to imperative code
For if..else: const showPage() { if(current_user) { return renderPage(current_user); } else { return ...
- pandas 学习(五)—— datetime(日期)
date range pd.date_range('2014-11-19', '2014-11-21', freq='D') # 起始时间,终止时间,时间间隔,也即步长,D ⇒ Day,5H:以 5 ...
- auto_create_partition
#!/usr/bin/env python # -*- encoding: utf8 -*- import calendar import time import os import sys from ...
- [Angular Directive] 3. Handle Events with Angular 2 Directives
A @Directive can also listen to events on their host element using @HostListener. This allows you to ...
- js进阶 11-14 jquery如何实现元素的替换和遍历
js进阶 11-14 jquery如何实现元素的替换和遍历 一.总结 一句话总结:替换:replaceAll() 与 replaceWith().遍历:each(). 1.replaceAll() ...