MVC模式简介

来源:互联网 发布:马克威算法 编辑:程序博客网 时间:2024/05/16 20:26

模型-视图-控件(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();}}@Overridepublic void actionPerformed(ActionEvent event) {// TODO Auto-generated method stubinvalidate();}@Overridepublic void draw(Canvas canvas) {// TODO Auto-generated method stubsuper.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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubdouble radius = Double.parseDouble(radiusEt.getText().toString());model.setRadius(radius);}});}}





0 0
原创粉丝点击