• 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);
    			}
    		});
    	}
    }
    





  • 相关阅读:
    2020牛客暑期多校训练营(第三场)C-Operation Love(计算几何)
    洛谷 P3376 【模板】网络最大流
    2020牛客暑假多校训练营(第二场)F-Fake Maxpooling(单调队列)
    Codeforces Round #655 (Div. 2)【ABCD】(题解)
    Codeforces Round #648 (Div. 2)【ABCDEF】(题解)
    Codeforces Round #647 (Div. 2)
    Codeforces Round #646 (Div. 2)【ABCDE】(题解)
    Educational Codeforces Round 88 (Rated for Div. 2)【ABCDE】(题解)
    [蓝帽杯2020]一个利用data伪协议和include,file_get_contents写shell的web题
    [网鼎杯2020朱雀场] misc部分题解
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4491879.html
Copyright © 2020-2023  润新知