MVC模式简单介绍

时间:2022-09-02 15:00:11

模型-视图-控件(model-View-Controller)MVC结构是一种开发模块的方法,它将数据存储和数据处理从数据的可视化表示中分离出来。存储和处理数据的组件称为模型,它包括模块的实际内容。表示数据的组件称为视图,它处理模块全部必要的行为,完毕模块的全部显示。控件一般是一种用来获取数据的组件。

MVC模式简单介绍

把模块分解成模型与视图有两个明显长处:

1.能够使用多个视图共享同一个模型数据。

2.能够简化复杂应用程序的编写,使用模块具有可伸缩性,而且易于维护。能够改动视图但不会影响模型,反之亦然。

使用MVC最重的一点是,因模型包包括数据,视图显示数据,所以一旦一个视图与模型建立联系,它一定要与该模型同步。

模型数据改变了通知视图,视图接受通知,更新受影响的视图区域。

这里能够使用前面一篇文章介绍的观察者模式实现,假设读者者对java 事件托付模型了解的话也能够使用这样的方式去实现。

MVC另一种变体就是将控件和视图结合在一起。在这样的情况下,视图不仅显示数据,也作为接口和用户进行交互,接受用户的输入。例如以下图所看到的:

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模式简单介绍的更多相关文章

  1. MVC模式的介绍&lpar;C&num;&rpar;

    MVC模式的介绍(C#)   Benefits在开发项目中使用“模型-视图-控制器(MVC)”模式的好处在于可以完全消除商业流程和应用表达层之间的相互影响.此外,还可以获得一个完全独立的对象来控制表达 ...

  2. 转载 mvc&colon;message-converters简单介绍 https&colon;&sol;&sol;www&period;cnblogs&period;com&sol;liaojie970&sol;p&sol;7736098&period;html

    mvc:message-converters简单介绍 说说@ResponseBody注解,很明显这个注解就是将方法的返回值作为reponse的body部分.我们进一步分析下这个过程涉及到的内容,首先就 ...

  3. TCP同步与异步及阻塞模式,多线程&plus;阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  4. ASP&period;NET&comma;什么是MVC&comma;MVC的简单介绍

    什么是MVC模式 MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Co ...

  5. 基于jsp&plus;servlet&plus;javabean的MVC模式简单应用

    原先写在CSDN的一篇,我直接扒过来吧.之前打算在CSDN的,结果写了几回,发现他那个发布系统简直烂到家,经常丢失图片各种.所以很长一段时间我也没写什么. 一.MVC模式 1.M :  javabea ...

  6. MVC的开发模式简单介绍

    MVCM model 模型 实体类和业务和dao dao(数据库访问对象)V view 视图 jspC controller 控制器 servlet 作用:视图和逻辑分离 开发设计顺序 1.设计数据库 ...

  7. C&num; MVC分页简单介绍

    ASP.NET MVC中进行分页的方式有多种,这里介绍一种简单实用的方法 一:在实现分页之前,先添加“PagedList”和“PagedList.Mvc”两个组件,具体下载直接在NuGet程序包里收索 ...

  8. android MVP模式简单介绍

    原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...

  9. Android MVP模式简单介绍:以一个登陆流程为例

    老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...

随机推荐

  1. Bitmap 的几种压缩方式

    微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩.试了几种方法,一一道来. 代码如下 ByteArrayOutputStream baos =  new  ByteArrayOutputSt ...

  2. 使用 jQuery &amp&semi; CSS3 实现翻转的作品集滑块

    作为 Web 开发人员,我想你一定见过各种各样的图片滑块效果.展示产品或者个人作品的方法有很多,其中之一是使用网格样式的滑块效果.在本教程中,我将分享如何使用 jQuery 和 CSS3 变换实现翻转 ...

  3. 如何用ZBrush雕刻出栩栩如生的头发(一)

    之前的ZBrush教程我们学习了使用SubTool为模型添加了头发效果,本讲对模型头发雕刻技巧和细节进行调整.文章内容仅以fisker老师讲述为例,您也可以按照自己的想法,跟着老师的步调进行创作,发挥 ...

  4. MVC4 开篇

    开篇,肯定不讲技术. 新项目开工了,用到了MVC4,赶快来园子吐槽下. 刚出来一年,学到了一些东西,但是自知比菜鸟还不如,空闲不看书,不练习demo,快吐我吧... 哈哈,吐吧,哥还是一样淡定,淡定, ...

  5. 前端之JavaScript

    JavaScript JavaScript 是一种轻量级的编程语言:是可插入 HTML 页面的编程代码:JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行. 一,编写方式 1.Ja ...

  6. COJ 0342 逆序对(一)

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=312 试题描述: 给你一个大小为N的int数组A.请你统计有多少数对(Ai, ...

  7. 微信小程序(有始有终,全部代码)开发--- 新增模块: 图片选取以及拍照功能

    开篇语 前几天发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 后来又发了BUG修复的版本: 简年18: 微信小程序(有始有终,全部代码)开发 ...

  8. QQ音乐的动效歌词是如何实践的?

    本文由云+社区发表 作者:QQ音乐技术团队 一. 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果.当然,我们也不 ...

  9. sessionStorage:写入记事本功能&lbrack;内容写入sessionStorage中,读取,删除&rsqb;

    知识点: 1.设置sessionStorage----setItem:sessionStorage.setItem(key,data); 存储数据使用key是唯一,不可重复,每触发都生成:如用一个固定 ...

  10. linux 虚拟机配置固定ip

    参考这边博客: https://blog.csdn.net/u014466635/article/details/80284792 但是这个有个小问题,就是没有配置dns,导致连不上公网 /etc/s ...