MVC和Observer

MVC小例子 使用Java类库observer和Observable 这是最简单的一个MVC实例,通过它你可以了解MVC的基本工作原理。 立即下载
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> MVC: “模型-视图-控制器(Model-View-Controller,MVC)结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。例如下图中的例子: [img]http://www.cs.nyu.edu/courses/spring99/V22.0480-001/lectures/images/l14_im2.JPG[/img] 我们看到,图中的几组数据以不同的形式(View)表现出来,一个是表格样式,一个是图形样式。 MVC把这种应用程序分为三种对象类型: 模型:维护数据并提供数据访问方法。 视图:给制模型的部分数据或所有数据的可视图。 控制器:处理事件. 以下是典型的MVC通信方式, [img]http://www.javable.com/columns/serv_side/workshop/11/1.gif[/img] [这个贴子最后由eclipse在 2002/09/03 03:49pm 编辑] 设计模式:实战MVC模式 turbochen(原作) 关键字 design pattern,mvc,observer,java 内容: 1.MVC 2.Observer接口 3.模型Model 4.视图View 5.控制器Controller 6.运行程序 -------------------------------------------------------------------------------- MVC “模型-视图-控制器(Model-View-Controller,MVC)结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。例如下图中的例子: [img]http://www.cs.nyu.edu/courses/spring99/V22.0480-001/lectures/images/l14_im2.JPG[/img] 我们看到,图中的几组数据以不同的形式(View)表现出来,一个是表格样式,一个是图形样式。 MVC把这种应用程序分为三种对象类型: 模型:维护数据并提供数据访问方法。 视图:给制模型的部分数据或所有数据的可视图。 控制器:处理事件. 以下是典型的MVC通信方式, [img]http://www.javable.com/columns/serv_side/workshop/11/1.gif[/img] 事件由控制器来处理,控制器接收用户事件,并根据事件的类型来改变模型。 视图事先会在模型中登记,当模型数据发生改变时,马上通知已向此模型登记的每个视图。 视图从模取得最新的数据并刷新自己. 要实现MVC,最重要的一个环节是使用Design Pattern中的Observer模式。Observer模式允许某个对象在所观察的对象发生修改时通知多个观察者(Observer). 下面我们就以实例来讲解如何用Obserer模式实现MVC的程序结构。在我的例子中,我要实现一个学生年龄显示的例子。分别用清单和图形的方式显示每个学生的年龄。当年龄改变时,自动更新显示。 Observer接口 为了实现观察的对象发生修改时通知多个观察者,通常要在被观察者与观察者之间有一个小的接口,如下: /* file: Observer.java */



public interface Observer

{

   public void dataUpdate(Model model);

}
这个接口中有一个dataUpdate(Model model)方法,只要实现了这个接口对象,就成了一个观察者。 模型Model 再来建立一个数据模型。在我的例子中,先建立了一个数据对象: /* file: Data.java */



public class Data

{

   public int value;   public String name;

}
现在来建立一个Model: /* file: Model.java */



import java.util.*;

public class Model

{

   ArrayList data = new ArrayList();

   ArrayList observer = new ArrayList();

   public Model()

   {    super();

   }

   public Model(int[] value, String[] name)

   {

       for ( int i = 0; i< value.length; i   )

       {

           addData(value[i],name[i]);

       }

   }

   public Model(Data[] data)

   {

       for ( int i = 0; i< data.length; i   )

       {

           addData(data[i]);

       }

   }

   public void addData(int value, String name)

   {

       Data data = new Data();

       data.value = value;

       data.name = name;

       this.data.add(data);

   }

   public void addData(Data data)

   {

       this.data.add(data);

   }

   public Data getData(int idx)

   {

       return (Data)(data.get(idx));

   }



   public int size()

   {

       return data.size();

   }

   public void registerObserver(Observer o)

   {

       observer.add(o);

   }

   public void removeObserver(Observer o)

   {

       observer.remove(o);

   }

   public void changeModel(Model model)

   {

       data.clear();

       for (int i=0; i
这个模型提供各种数据访问的方法。并提供一个changeModel(Model model)方法供Controller访问。还提供一个registerObserver(Observer o)方法,用来向Model中登记观察者Observer。 视图View 我们要实现一个清单显示样式的视图View1和一个图形方式显示的视图View2,并让它们实现Observer接口,以便当Model数据改变时,自动刷新自己. /* file: View1.java */



import javax.swing.*;

import java.awt.*;

import javax.swing.border.*;

public class View1 extends JPanel implements Observer

{

   Model model;



   public View1()

   {

   }

   public View1(Model model)

   {

       try

       {

           this.model = model;

           jbInit();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

   }

   private void jbInit() throws Exception

   {

       this.setBackground(Color.white);

       this.setBorder(new TitledBorder(BorderFactory.createLineBorder(Color.black,1),"View1"));

   }



   public void paintComponent(Graphics g)

   {

       super.paintComponent(g);

       if ( model == null ) return;

       int x = 20,y = 50;

       int h = g.getFontMetrics().getHeight();

       for ( int i=0; i< model.size(); i   )

       {

           Data data = model.getData(i);

           g.drawString(data.name,x,y);

           y =h;

           g.drawString(String.valueOf(data.value),x,y);

           y =h;

       }

   }

   public void dataUpdate(Model model)

   {

       /**@todo: Implement this Observer method*/

       this.model = model;

       repaint();

   }

}

/* file: View2.java */

import javax.swing.*;

import java.awt.*;

import javax.swing.border.*;

public class View2 extends JPanel implements Observer

{

   Model model;



   public View2()

   {

   }

   public View2(Model model)

   {

       try

       {

           this.model = model;

           jbInit();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }

   }

   private void jbInit() throws Exception

   {

       this.setBackground(Color.white);

       this.setBorder(new TitledBorder(BorderFactory.createLineBorder(Color.black,1),"View1"));

   }



   public void paintComponent(Graphics g)

   {

       super.paintComponent(g);

       if ( model == null ) return;

       int x = 20,y = 50;

       int h = g.getFontMetrics().getHeight();

       int width = this.getWidth();

       int height = this.getHeight();

       int sy = height / model.size();

       int sx = width/ 2;

       for ( int i=0; i< model.size(); i   )

       {

           Data data = model.getData(i);

           int value = data.value;

           int dx = 3;

           int r = 3;

           Color c = new Color((int)(255*Math.random()),(int)(255*Math.random()),(int)(255*Math.random()));

           int cx = sx;

           int cy = y i * sy;

           for ( int j=0;j
控制器Controller 好了,MVC中的Model,Observer都建立好了,我们最后来做一个Controller:



import java.awt.*;

import javax.swing.*;

import javax.swing.border.*;

import java.awt.event.*;

public class Controller extends JFrame

{

   Model model =  new Model();

   View1 view1 = new View1(model);

   View2 view2 = new View2(model);

   JScrollPane jScrollPane1 = new JScrollPane();

   JButton jButton1 = new JButton();

   JTextField jTextField1 = new JTextField();

   JTextField jTextField2 = new JTextField();

   JLabel jLabel1 = new JLabel();

   JLabel jLabel2 = new JLabel();

   JLabel jLabel3 = new JLabel();

   public Controller()

   {

       try

       {

           jbInit();

       }

       catch(Exception e)

       {

           e.printStackTrace();

       }



   }

   private void jbInit() throws Exception

   {

       Data[] data = new Data[2];

       data[0] = new Data();

       data[1] = new Data();

       data[0].name = "Ted";

       data[0].value = 20;

       data[1].name = "Joy";

       data[1].value = 14;

       model.addData(data[0]);

       model.addData(data[1]);

       model.registerObserver(view1);

       model.registerObserver(view2);



       this.getContentPane().setLayout(null);

       jScrollPane1.setBounds(new Rectangle(0, 0, 3, 3));

       jButton1.setBounds(new Rectangle(309, 259, 101, 27));

       jButton1.setText("Update");

       jButton1.addActionListener(new java.awt.event.ActionListener()

       {

           public void actionPerformed(ActionEvent e)

           {

               jButton1_actionPerformed(e);

           }

       });

       jTextField1.setText("20");

       jTextField1.setBounds(new Rectangle(80, 254, 52, 30));

       jTextField2.setText("14");

       jTextField2.setBounds(new Rectangle(178, 255, 50, 31));

       jLabel1.setText("Age:");

       jLabel1.setBounds(new Rectangle(41, 226, 47, 23));

       jLabel2.setText("Ted");

       jLabel2.setBounds(new Rectangle(42, 252, 35, 33));

       jLabel3.setText("Joy");

       jLabel3.setBounds(new Rectangle(144, 255, 31, 31));

       view1.setBounds(new Rectangle(7, 5, 225, 208));

       view2.setBounds(new Rectangle(234, 4, 219, 209));

       this.getContentPane().add(jScrollPane1, null);

       this.getContentPane().add(jTextField2, null);

       this.getContentPane().add(jTextField1, null);

       this.getContentPane().add(jLabel2, null);

       this.getContentPane().add(jLabel3, null);

       this.getContentPane().add(jLabel1, null);

       this.getContentPane().add(jButton1, null);

       this.getContentPane().add(view1, null);

       this.getContentPane().add(view2, null);

   }

   void jButton1_actionPerformed(ActionEvent e)

   {

       Data[] data = new Data[2];

       data[0] = new Data();

       data[1] = new Data();

       data[0].name = jLabel1.getText();

       data[0].value = Integer.parseInt(jTextField1.getText());

       data[1].name = jLabel2.getText();

       data[1].value = Integer.parseInt(jTextField2.getText());

       Model m = new Model(data);

       this.model.changeModel(m);

   }

   public static void main(String[] args)

   {

       Controller c = new Controller();

       c.setSize(475,310);

       c.setVisible(true);

   }

}

运行程序 各位可以将这些代码各自存为相应的源文件,执行以下命令编译 javac Controller.java 运行 java Controller.class 就可以看到程序执行的效果, 你可以试着改变两个学生的年龄,按一下Update按钮,相应的视图就更新了。怎么样,体验到了MVC结构给程序带来的方便性了吧?;)
Nvidia Jetson CH340 驱动安装 最近调一个USB设备,Windows系统上是可以安装CH340 驱动使用的,移到Jetson AGX Orin 上发现没有 /dev/ttyUSB* 设备显示。是一个为盲人和视力障碍者提供的终端设备驱动程序,它会在系统启动时自动加载并占用串口设备,导致我们无法正常使用部分串口设备。安装完后,内核中已经有。 阅读详情

相关推荐

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1654

MVC模型中的Observer模式

Symbian----MVC模型中的Observer模式--------------------------------------------------------------------------------------------------MVC区别于一般结构的地方在于:对于Model,MVC只需要一个Observer,即UI。(通常来说,一个“主体”可能对应许多个“观察者”,

luobonet的专栏 807

倍福TwinCAT3 OPC UA配置全流程:从安装到无密码访问(附常见问题解决)

本文提供了倍福TwinCAT3 OPC UA配置的完整实战指南,重点讲解如何实现无密码游客访问。从软件安装、授权配置、服务器初始化到深度排错,详细解析了配置流程中的关键步骤与常见陷阱,帮助工程师高效打通PLC与上位系统的数据通讯通道。

vulkan6gpu的博客 473

MVC-Observer(观察器)

Observer(观察器)发布日期: 4/1/2004 | 更新日期: 4/1/2004Observer(观察器)Version 1.0.1本页内容上下文问题影响因素解决方案示例结果上下文相关模式致谢上下文在面向对象的编程中,对象同时包含数据和行为,这两者一起表示业务域的特定方面。使用对象生成应用程序的优点之一是可以将所有数据操作封装在对象内。这样,就使对象成为独立的单位,并增加了在其他应用程序中

Frank的专栏 1355

Windows环境Oracle19C安装与配置全攻略

本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。

weixin_28455801的博客 487

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展与软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 5637

观察者模式( Observer Pattern ): MVC的进一步泛化

参考书籍: 《Design Patterns: Elements of Reusable Object-Oriented Software》 在商业项目中第一次读到观察者模式的代码是一个异步服务器消息分发的实现部分。由此开始学习了一下 。 如果说单例模式和工厂方法模式是入门级程序员都必须掌握的方法, 那么观察者模式则是所有实际项目开发者都会直接或者间接用到的模式, 原因是: 观察者模式是MVC模式

萧萧的专栏 7852

开源TMS系统cortex-tms私有化部署与二次开发实战指南

运输管理系统(TMS)是现代物流数字化的核心组件,它通过将线下零散的物流操作转化为线上标准化、可追溯的数据流,实现订单、调度、跟踪与结算的全流程管理。其技术原理通常基于微服务架构,采用Spring Boot、Vue.js等成熟技术栈构建,确保系统的稳定性和可扩展性。TMS的技术价值在于显著提升物流企业的运营效率、降低成本并增强过程可控性,尤其适用于中小型物流企业实现从手工管理到系统化管理的跨越。在应用场景上,TMS广泛应用于车队管理、订单跟踪和财务结算等环节。本文聚焦于开源TMS项目cortex-tms,深

weixin_42523907的博客 747

Asp.Net MVC与Observer模式

今天先说一下Observer Pattern,然后结合一下MVC模式分析两者之间的联系.可能有说的不到之处,请看过的达人提出宝贵意见. 还是先说下定义,Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 Observer模式中包括几点要素: 1、主题对象,能对多个依赖于它的对象(多个观察者)进行处理,使...

anglie5719的博客 198

STM32 SPI驱动TFT LCD实战:时序配置与硬件协同

SPI(串行外设接口)是一种高速、全双工、同步串行通信协议,广泛应用于微控制器与显示模组等外设的数据交互。其核心依赖时钟极性(CPOL)与时钟相位(CPHA)组合定义的四种工作模式,直接影响数据采样可靠性;而片选(NSS)与MOSI/SCLK等信号的硬件映射,则决定了多设备共总线下的通信稳定性。在TFT LCD驱动场景中,SPI凭借低开销、高吞吐优势成为主流选择,尤其适配ST7789、ILI9341等集成显示控制器的模块。本文聚焦STM32L系列MCU通过SPI2驱动1.3寸LCD的完整链路,涵盖Mode

php55的博客 1211

Jetson Nano之CSI摄像头操作方法

jetson端csi摄像头的应用方法

ZONGXP的博客 1万+

Observer Pattern Implement MVC

MVC“模型-视图-控制器(Model-View-Controller,MVC)结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离。例如下图中的例子:我们看到,图中的几组数据以不同的形式(View)表现出来,一个是表格样式,一个是图形样式。MVC把这种应用程序分为三种对象类型:模型:维护数据并提供数据访问方法。视图:给制模型的部分数据或所有数据的可视

jxluoix的专栏 674

《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位

【代码】《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位。

2301_79143213的博客 1273

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(二)

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(二) Author: 孙东风Date:03/12/2007        在上一讲中,我们利用MVC+Observer模式设计了移动开发框架。那么,这一节里我们会以一个"媒体播放"为具体实例来实现这个框架。        首先,可以利用UML建模工具进行如下类的设计:         这个类图对应上节我们所讲解的框架

软件开发资料汇总 946

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

第三篇 android 应用开发模式之MVC模式及Observer模式

如果说模板模式是ANDROID框架的核心,提供了应用程序架构组件的基础,而Observer模式则提供了ANDROD架构连接件的基础,同时也是另外两个组件广播组件及内容提供者组件的实现基础,还是UI输入机制的基础。Observer模式在android应用程序及框架中普遍采用。 Observer模式也称作发布/订阅模式,实现机理是消息发布/订阅模式的事件驱动模型:消息的生产者发布事件,而使用者订阅感

固弘的专栏 3757

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Sourcetrail架构设计模式:MVC、Observer、Factory等模式的应用

在现代软件开发中,面对日益复杂的代码库,开发人员经常需要快速理解陌生的代码结构。Sourcetrail作为一款开源的交互式源代码探索工具,通过精心的架构设计解决了这一痛点。本文将深入分析Sourcetrail中应用的多种设计模式,揭示其如何通过MVC(Model-View-Controller)、Observer(观察者)、Factory(工厂)等经典模式构建出高效、可维护的代码探索系统。 读完...

gitblog_00591的博客 990

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)

 做移动平台的开发不知不觉已经几年,先后接触过Kjava、Symbian、Windows mobile平台,做过游戏,也做过应用,而且以联网的居多。         我也时常辗转于不同平台间代码的移植,Java到C++、C++到Java,期间大多的时间浪费在平台框架的不一致性上。         而移动开发的平台又层出不穷,继以前的Kjava、Brew、Symbian、Palm、Linux、Win

mingxunzh的专栏 800

构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)(一)

 构建基于MVC+Observer模式的、艺术性的移动开发框架(KJAVA版)Author:孙东风Date:29/11/2007        做移动平台的开发不知不觉已经几年,先后接触过Kjava、Symbian、Windows mobile平台,做过游戏,也做过应用,而且以联网的居多。         我也时常辗转于不同平台间代码的移植,Java到C++、C++到Java,期间大多的时间浪

.NET博文收藏 607
上一篇: Windows XP准备恢复加载Java 但还须等待
下一篇: 一些面向对象的设计法则(2)
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值