`
lindongxiao
  • 浏览: 47745 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

两种不同的实现mvc模式(2) 使用Observer实现

阅读更多
http://lindongxiao.iteye.com/admin/show/98810这里有另外一种实现,可以对比
view接口
java 代码
 
  1. public interface View {  
  2.     public void refreshContactView(String firstName, String lastName);  
  3. }  
java 代码
 
  1. import java.awt.BorderLayout;  
  2. import java.awt.GridLayout;  
  3. import java.awt.event.ActionEvent;  
  4. import java.awt.event.ActionListener;  
  5.   
  6. import javax.swing.BoxLayout;  
  7. import javax.swing.JButton;  
  8. import javax.swing.JLabel;  
  9. import javax.swing.JPanel;  
  10. import javax.swing.JTextField;  
  11. import mvcpattern1.EditController;  
  12.   
  13. public class EditView extends JPanel implements View{  
  14.   
  15.     private static final String UPDATE_BUTTON = "Update";  
  16.   
  17.     private static final String EXIT_BUTTON = "Exit";  
  18.   
  19.     private static final String CONTACT_FIRST_NAME = "First Name  ";  
  20.   
  21.     private static final String CONTACT_LAST_NAME = "Last Name  ";  
  22.   
  23.     private static final int FNAME_COL_WIDTH = 25;  
  24.   
  25.     private static final int LNAME_COL_WIDTH = 40;  
  26.   
  27.     private EditController controller;  
  28.   
  29.     private JLabel firstNameLabel, lastNameLabel;  
  30.   
  31.     private JTextField firstName, lastName;  
  32.   
  33.     private JButton update, exit;  
  34.   
  35.     public EditView(TextModel model) {  
  36.          controller = new EditController(model,this);  
  37.          createGui();  
  38.     }  
  39.   
  40.     public void createGui() {  
  41.         update = new JButton(UPDATE_BUTTON);  
  42.         exit = new JButton(EXIT_BUTTON);  
  43.   
  44.         firstNameLabel = new JLabel(CONTACT_FIRST_NAME);  
  45.         lastNameLabel = new JLabel(CONTACT_LAST_NAME);  
  46.   
  47.         firstName = new JTextField(FNAME_COL_WIDTH);  
  48.         lastName = new JTextField(LNAME_COL_WIDTH);  
  49.   
  50.         JPanel editPanel = new JPanel();  
  51.         editPanel.setLayout(new BoxLayout(editPanel, BoxLayout.X_AXIS));  
  52.   
  53.         JPanel labelPanel = new JPanel();  
  54.         labelPanel.setLayout(new GridLayout(01));  
  55.   
  56.         labelPanel.add(firstNameLabel);  
  57.         labelPanel.add(lastNameLabel);  
  58.   
  59.         editPanel.add(labelPanel);  
  60.   
  61.         JPanel fieldPanel = new JPanel();  
  62.         fieldPanel.setLayout(new GridLayout(01));  
  63.   
  64.         fieldPanel.add(firstName);  
  65.         fieldPanel.add(lastName);  
  66.   
  67.         editPanel.add(fieldPanel);  
  68.   
  69.         JPanel controlPanel = new JPanel();  
  70.         controlPanel.add(update);  
  71.         controlPanel.add(exit);  
  72.         update.addActionListener(controller);  
  73.         exit.addActionListener(new Handler());  
  74.   
  75.         setLayout(new BorderLayout());  
  76.         add(editPanel, BorderLayout.CENTER);  
  77.         add(controlPanel, BorderLayout.SOUTH);  
  78.     }  
  79.   
  80.     public Object getUpdateRef() {  
  81.         return update;  
  82.     }  
  83.   
  84.     public String getFirstName() {  
  85.         return firstName.getText();  
  86.     }  
  87.   
  88.     public String getLastName() {  
  89.         return lastName.getText();  
  90.     }  
  91.   
  92.     public void refreshContactView(String newFirstName, String newLastName) {  
  93.         firstName.setText(newFirstName);  
  94.         lastName.setText(newLastName);  
  95.   
  96.     }  
  97.   
  98.     private class Handler implements ActionListener {  
  99.         public void actionPerformed(ActionEvent event) {  
  100.             System.exit(0);  
  101.         }  
  102.     }  
  103.   
  104. }  

显示view java 代码
 
  1. import java.awt.BorderLayout;  
  2.   
  3. import javax.swing.JPanel;  
  4. import javax.swing.JScrollPane;  
  5. import javax.swing.JTextArea;  
  6. import java.util.*;  
  7.   
  8. class DisplayView extends JPanel implements View,Observer{  
  9.     private JTextArea display;  
  10.       
  11.     public DisplayView(){  
  12.         createGui();  
  13.     }  
  14.       
  15.     public void createGui(){  
  16.         setLayout(new BorderLayout());  
  17.         display = new JTextArea(1040);  
  18.         display.setEditable(false);  
  19.         JScrollPane scrollDisplay = new JScrollPane(display);  
  20.         this.add(scrollDisplay, BorderLayout.CENTER);  
  21.     }  
  22.       
  23.     public void refreshContactView(String newFirstName,  
  24.         String newLastName){  
  25.         display.setText("UPDATED CONTACT:\nNEW VALUES:\n" +  
  26.             "\tName: " + newFirstName + " " + newLastName +  
  27.              "\n" );  
  28.             }  
  29.     public void update(Observable o, Object arg) {  
  30.         if (arg instanceof TextModel){  
  31.         String firstName=((TextModel)arg).getFirstName();  
  32.         String lastName=((TextModel)arg).getLastName();  
  33.           this.refreshContactView(firstName, lastName);  
  34.         }  
  35.     }  
  36. }      

model java 代码
 
  1. import java.util.Observable;  
  2.   
  3.   
  4. public class TextModel extends Observable {  
  5.     private String firstName;  
  6.     private String lastName;  
  7.   
  8.     public TextModel(){  
  9.     }  
  10.   
  11.     public void updateModel(String newFirstName, String newLastName) {  
  12.   
  13.         if (!isEmptyString(newFirstName)) {  
  14.             setFirstName(newFirstName);  
  15.         }  
  16.         if (!isEmptyString(newLastName)) {  
  17.             setLastName(newLastName);  
  18.         }  
  19.     }  
  20.   
  21.     public String getFirstName() {  
  22.         return firstName;  
  23.     }  
  24.   
  25.     public String getLastName() {  
  26.         return lastName;  
  27.     }  
  28.   
  29.     public void setFirstName(String newFirstName) {  
  30.         firstName = newFirstName;//     设置变化点   
  31.        setChanged();  
  32.         notifyObservers(this);  
  33.     }  
  34.   
  35.     public void setLastName(String newLastName) {  
  36.         lastName = newLastName;//       设置变化点   
  37.          setChanged();  
  38.          notifyObservers(this);  
  39.     }  
  40.   
  41.     private boolean isEmptyString(String input) {  
  42.         return ((input == null) || input.equals(""));  
  43.     }  
  44.   
  45.       
  46. }  
控制类
java 代码
 
  1. import java.awt.event.ActionEvent;  
  2. import java.awt.event.ActionListener;  
  3.   
  4. public class EditController implements ActionListener {  
  5.     private TextModel model;  
  6.     private EditView view;  
  7.       
  8.     public EditController(TextModel m, EditView v){  
  9.         model = m;  
  10.         view = v;  
  11.     }  
  12.       
  13.       
  14.     public void actionPerformed(ActionEvent evt){  
  15.         Object source = evt.getSource();  
  16.         if (source == view.getUpdateRef()){  
  17.             updateModel();  
  18.         }  
  19.     }  
  20.     private void updateModel(){  
  21.         String firstName = null;  
  22.         String lastName = null;  
  23.         if (view.getFirstName()!=null){  
  24.             firstName = view.getFirstName();  
  25.         }  
  26.         if (view.getLastName()!=null){  
  27.             lastName = view.getLastName();  
  28.         }  
  29.         model.updateModel( firstName, lastName);  
  30.     }  
  31.       
  32.   
  33. }  
运行mvc
java 代码
 
  1. import javax.swing.JFrame;  
  2. import javax.swing.JPanel;  
  3.   
  4. public class RunMVCPattern {  
  5.   
  6.     public static void main(String [] arguments){  
  7.         DisplayView displayView = new DisplayView();  
  8.          
  9.          
  10.         TextModel model = new TextModel();  
  11.         model.addObserver(  displayView);  
  12.           
  13.         EditView editorView = new EditView(model);  
  14.         createGui(editorView, "Contact Edit Window");  
  15.           
  16.         System.out.println("Creating DisplayView");  
  17.         createGui(displayView, " Display Window");  
  18.           
  19.     }  
  20.       
  21.     private static void createGui(JPanel contents, String title){  
  22.         JFrame applicationFrame = new JFrame(title);  
  23.         applicationFrame.getContentPane().add(contents);  
  24. //        applicationFrame.setSize(400, 100);  
  25.         applicationFrame.pack();//自动适应大小  
  26.        // applicationFrame.addWindowListener(new WindowClose());  
  27.       //  applicationFrame.setDefaultCloseOperation(applicationFrame.EXIT_ON_CLOSE);  
  28.         applicationFrame.setVisible(true);  
  29.     }  
  30.       
  31. }  
分享到:
评论

相关推荐

    运用MVC模式及观察者模式的java小程序

    在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的设计模式:Model-View-Controller(MVC)模式和Observer(观察者)模式。这两种模式在JavaWeb开发中扮演着至关重要的角色。 ...

    MVC模式 MVC组件类型的关系和功能

    MVC模式在实际开发中,如Struts框架,仅实现了视图和控制器,模型部分需要开发者自定义实现。随着技术的发展,Spring MVC等框架提供了更全面的MVC支持,简化了开发工作。理解并熟练运用MVC模式,对于构建高效、灵活...

    ToDo-list:使用MVC + Observer模式的Vanilla js中的ToDo列表

    - `script.js`:JavaScript代码,实现MVC模式和Observer模式。 通过阅读和理解这些文件,你可以学习到如何在没有依赖库或框架的情况下,使用纯JavaScript实现一个功能完备且具有良好架构的Todo List应用。这将有助...

    PureMVC 术语阐述与最佳实践(英汉对照读本)

    8. **观察者(Observer)**:观察者模式在PureMVC中用于实现事件通知机制,当模型发生变化时,通知相关的视图进行更新。 9. **通知(Notification)**:通知是PureMVC内部通信的主要手段,它们是带有类型和可选数据...

    清华认证IT工程师 第13分册 JAVA 架构设计.doc

    1. **实现概述**:实际开发中,可以使用Struts、Spring MVC等框架来实现MVC模式。它们提供了一套完整的解决方案,简化了开发流程。 2. **具体实现过程**:通常包括配置Action、编写Controller、定义Model类、创建...

    Flex MVC框架下载

    标题提到的"Flex MVC框架下载",指的是提供了两种主流的Flex MVC框架——PureMVC和Cairngorm的SWC库文件。SWC是Adobe Flash和Flex中用于共享库和组件的二进制格式,开发者可以直接将这些库导入到项目中使用,无需...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

    学习 ASP.NET MVC

    除了经典的MVC模式,还有两种常见的变种——Observer模式和Model-View-Presenter(MVP)模式。Observer模式通常用于实现数据绑定,使得View可以自动更新Model的变化;MVP模式则进一步分离了视图和控制器的角色,...

    使用 Microsoft.NET 的企业解决方案模式

    例如,使用Repository模式进行数据访问抽象,与依赖注入模式结合以实现灵活的服务定位,再配合MVC(模型-视图-控制器)模式构建用户界面,可以构建出高度解耦、易于测试和维护的系统。 此外,书中还深入探讨了如何...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)__(0521).rar

    C#的WinForm应用开发通常涉及用户界面和业务逻辑的交互,因此书中可能还会介绍如何利用设计模式来分离这两部分,例如使用MVC(Model-View-Controller)或MVVM(Model-View-ViewModel)模式。此外,可能会探讨如何...

    GUI.rar_chat observer

    4. **模型-视图-控制器(MVC)**:一种设计模式,将数据模型、界面显示(视图)和用户交互逻辑(控制器)分离,便于代码的维护和扩展。 **观察者模式** 观察者模式是一种行为设计模式,它定义了对象之间的一对多...

    基于Android端MVP模式和响应式网络框架的设计与实现.pdf

    RxJava引入了Observable(可观察者)和Observer(观察者)两种模式,让开发者可以更简洁地处理多事件序列,从而实现更为灵活的网络请求和数据处理。 在项目实践中,文档指出,传统的HttpURLConnection类在进行HTTP...

    Java设计模式-第22章-观察者模式.ppt

    Java设计模式中的观察者模式(Observer Pattern)是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理和实时...

    设计模式中的23种模式详细图片

    11. **MVC(模型-视图-控制器)模式**:是一种软件设计模式,将用户界面、业务逻辑和数据存储分离,以实现灵活的可维护性和可扩展性。模型负责数据处理,视图负责显示,控制器负责协调模型和视图。 除了以上列出的...

    Observable与Observer

    在IT行业中,`Observable`与`Observer`是Java编程语言中的两个重要概念,它们是JavaFX和Java.util.Observable库的一部分,用于实现观察者模式。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个...

    设计模式的应用--论文素材2

    设计模式的应用分为两种主要类型:广泛暴露(broad exposure)和孤立使用(isolated use)。广泛暴露的设计模式如MVC和DAO模式,它们影响整个系统的设计和开发,需要多团队成员共同理解,并且一旦选择,很难更改。而...

    Java设计模式源代码——自己看pdf写的

    Java中`java.util.Observable`和`java.util.Observer`接口提供了观察者模式的实现。 7. **策略模式**: 策略模式定义了一系列算法,并使它们可以互相替换,让算法独立于使用它的客户。这在需要切换算法或者避免硬...

    设计模式part2

    引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 ...

    ASP.NET设计模式

    除了这些模式,ASP.NET还广泛使用其他设计模式,如单例模式(Singleton)用于管理全局资源,工厂方法模式(Factory Method)用于创建对象,策略模式(Strategy)用于定义算法族,以及观察者模式(Observer)用于事件...

Global site tag (gtag.js) - Google Analytics