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);
			}
		});
	}
}
时间: 2024-10-13 15:10:09

MVC模式简单介绍的相关文章

MVC控制器简单介绍 (内部使用)

MVC模式中的控制器(ccontroller) 主要相应用户的输入,并且在相应时修改模型(Model) 并且输入数据(View)应该算是MVC3个核心元素的灵魂元素 传统的WEBFORM是用户通过浏览器相应服务器磁盘上的HTML页面 而MVC就不同了,MVC是通过路由来相应操作方法(Action)并且为方法提供参数,然后方法决定使用什么视图 并且为视图渲染. 简单创建一个controller public class HomeController : Controller { // // GET

Objective-C 原型模式 -- 简单介绍和使用

先借鉴百科对原型模式的介绍: 定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建. 解决什么问题: 它主要面对的问题是:"某些结构复杂的对象"的创建工作:由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却

基于jsp+servlet+javabean的MVC模式简单应用

原先写在CSDN的一篇,我直接扒过来吧.之前打算在CSDN的,结果写了几回,发现他那个发布系统简直烂到家,经常丢失图片各种.所以很长一段时间我也没写什么. 一.MVC模式 1.M :  javabean; 2.V :  jsp; 3.C : servlet; 4.DB:MySQL: 二.文件夹 三.项目内容 1.建立数据库并封装数据库操作 create database testDB; use testDB; create table user ( id int auto_increment p

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统

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

老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来的好多都没法直接转化为项目里可以直接用的东西,所以这里正好拿出自己项目里已经用了的,你们可以直接用到自己的项目里.当然,不可能把所有项目代码在这里放出来,所以就拿登陆的流程出来,这个比较合适也比较常用. 1.先看下包结构: model:放一些bean类,以及网络处理类RetrofitManager,

Objective-C 外观模式--简单介绍和使用

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 在以下情况下可以考虑使用外观模式: (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式. (2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口. (3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互. 有点: (1)实现了子系统与客户端之间的松耦合关系. (2

MVC视图简单介绍(内部使用)

上一章说到了Controller,并且返回了字符串类型,但是用户界面往往不是简单的字符串可以满足的,所以MVC就有了视图(View) 视图的职责是向用户提供用户界面的, 下面我们新建一个View @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title

原型模式简单介绍【设计模式3】

前文回顾: 1 //上下文 2 public class Context { 3 public String getHandlerResult() { 4 return handlerResult; 5 } 6 7 public void setHandlerResult(String handlerResult) { 8 this.handlerResult = handlerResult; 9 } 10 11 private String handlerResult; 12 } 13 //H

MVC模式简单的Xml文档解析加Vue渲染

前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/Js/vue.js"></script></head><body> <div> <div id="vue_det"> <ul v-for="mess in message"> <