[转载]MVC模式简单讲解

[转载]MVC模式简单讲解 – 设计模式 – Java – JavaEye论坛.

意图

最终目标就是:分离视图和模型,让多个视图可以共用一个模型

类图


时序图



Test

Java代码
  1. package mvc;
  2. /**
  3. * MVC模式,最终目标就是:分离视图和模型,让多个视图可以共用一个模型
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public class Test {
  8. public static void main(String[] args){
  9. /* 模型可以重用*/
  10. IModel model = new ModelImpl();
  11. ViewTextAndControl viewText = new ViewTextAndControl();
  12. IController controller = new Controller();
  13. /*视图要委托给控制器处理请求,所以需要有个控制器的引用*/
  14. viewText.setController(controller);
  15. /*控制器选择模型去处理业务逻辑,所以需要有个模型的引用*/
  16. controller.setModel(model);
  17. /*为模型注册观察者,当模型变化时,及时通知给观察者*/
  18. model.registerObserver(viewText);
  19. ViewHtml viewHtml = new ViewHtml();
  20. /*这个html视图,只接受模型的数据
  21. IController controller2 = new Controller();
  22. viewHtml.setController(controller2);
  23. controller2.setModel(model);
  24. */
  25. model.registerObserver(viewHtml);
  26. /*模拟视图层的操作*/
  27. Test t = new Test();
  28. t.test(viewText);
  29. }
  30. private void test(ViewTextAndControl v){
  31. v.start(100);
  32. try {
  33. Thread.sleep(1000);
  34. v.add();
  35. Thread.sleep(1000);
  36. v.add();
  37. catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

IModel

Java代码
  1. package mvc;
  2. /**
  3. * 模型接口,被观察者
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public interface IModel {
  8. public void start(int startCount);
  9. public void stop();
  10. public void add();
  11. public int getCount();
  12. public void registerObserver(Observer observer);
  13. public void removeObserver(Observer observer);
  14. }

ModelImpl

Java代码
  1. package mvc;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. /**
  5. * 模型层实现
  6. * alex295111
  7. * 2010-8-5
  8. */
  9. public class ModelImpl implements IModel {
  10. private int count;
  11. private ArrayList observers = new ArrayList();
  12. public void add() {
  13. count++;
  14. notifyObservers();
  15. }
  16. public int getCount() {
  17. return count;
  18. }
  19. public void registerObserver(Observer observer) {
  20. observers.add(observer);
  21. }
  22. public void removeObserver(Observer observer) {
  23. if(observers.indexOf(observer)<0){
  24. observers.remove(observer);
  25. }
  26. }
  27. public void start(int startCount) {
  28. count = startCount;
  29. notifyObservers();
  30. }
  31. private void notifyObservers(){
  32. for(Iterator it = observers.iterator(); it.hasNext();){
  33. Observer observer = (Observer) it.next();
  34. observer.update(this);
  35. }
  36. }
  37. public void stop() {
  38. }
  39. }

IController

Java代码
  1. package mvc;
  2. /**
  3. * 控制器接口
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public interface IController {
  8. /**开始计数器*/
  9. public void start(int startCount);
  10. /** 停止计数器*/
  11. public void stop();
  12. /**数值增加*/
  13. public void add();
  14. public void setModel(IModel model);
  15. }

Controller

Java代码
  1. package mvc;
  2. /**
  3. * 控制器选择模型去处理业务逻辑,所以需要有个模型的引用
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public class Controller implements IController{
  8. private IModel model;
  9. public void add() {
  10. model.add();
  11. }
  12. public void start(int startCount) {
  13. model.start(startCount);
  14. }
  15. public void stop() {
  16. }
  17. public void setModel(IModel model) {
  18. this.model = model;
  19. }
  20. }

Observer

Java代码
  1. package mvc;
  2. /**
  3. * 观察者接口,在这里主要供给视图实现,因为视图要及时反映模型的状态
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public interface Observer {
  8. public void update(IModel model);
  9. }

ViewTextAndControl(视图1

Java代码
  1. package mvc;
  2. /**
  3. * 视图,处理展现还带有控制功能
  4. * 视图持有模型层和控制层引用
  5. * 将请求委托给控制器,由控制器决定使用哪个模型处理该请求
  6. * alex295111
  7. * 2010-8-5
  8. */
  9. public class ViewTextAndControl implements Observer {
  10. private IController controller;
  11. public void setController(IController controller) {
  12. this.controller = controller;
  13. }
  14. /*启动计数器*/
  15. public void start(int startCount){
  16. controller.start(startCount);
  17. }
  18. /*计数器加1*/
  19. public void add(){
  20. controller.add();
  21. }
  22. public void update(IModel model) {
  23. System.out.println(“我是文本格式ViewText:刚刚获得模型层数据count:”+model.getCount());
  24. }
  25. }

ViewHtml(视图2

Java代码
  1. package mvc;
  2. /**
  3. * html形式的视图,只接收数据
  4. * alex295111
  5. * 2010-8-5
  6. */
  7. public class ViewHtml implements Observer {
  8. public void update(IModel model) {
  9. System.out.println(“<h1>我是Html格式View2,刚刚获得模型层数据count:”+model.getCount()+“</h1>”);
  10. }
  11. }
    以下为了有个用户界面,添加了个Swing视图

    ViewSwingAndControl(视图3

    Java代码
    1. package mvc_swing;
    2. import java.awt.FlowLayout;
    3. import java.awt.event.ActionEvent;
    4. import java.awt.event.ActionListener;
    5. import javax.swing.JButton;
    6. import javax.swing.JFrame;
    7. import javax.swing.JTextField;
    8. public class ViewSwingAndControl implements Observer {
    9. private IController controller;
    10. public void setController(IController controller) {
    11. this.controller = controller;
    12. }
    13. private JFrame frame = new JFrame(“我是swing视图”);
    14. private JTextField countField = new JTextField(“count暂无值”);
    15. private JButton startButton = new JButton(“开始”);
    16. private JButton addButton = new JButton(“+1”);
    17. public ViewSwingAndControl(){
    18. frame.setLayout(new FlowLayout());
    19. frame.add(countField);
    20. frame.add(startButton);
    21. frame.add(addButton);
    22. frame.setLocation(500, 300);
    23. frame.setSize(200,200);
    24. frame.setVisible(true);
    25. addListener();
    26. setAddButtonDisable();
    27. }
    28. public void addListener(){
    29. startButton.addActionListener(new ActionListener(){
    30. public void actionPerformed(ActionEvent e) {
    31. controller.start(100);
    32. setAddButtonEnable();
    33. }
    34. });
    35. addButton.addActionListener(new ActionListener(){
    36. public void actionPerformed(ActionEvent e) {
    37. controller.add();
    38. }
    39. });
    40. }
    41. public void setAddButtonDisable(){
    42. this.addButton.setEnabled(false);
    43. }
    44. public void setAddButtonEnable(){
    45. this.addButton.setEnabled(true);
    46. }
    47. public void update(IModel model) {
    48. countField.setText(Integer.toString(model.getCount()));
    49. }
    50. }

    Test

    Java代码
    1. package mvc_swing;
    2. /**
    3. * MVC模式,最终目标就是:分离视图和模型,让多个视图可以共用一个模型
    4. * alex295111
    5. * 2010-8-5
    6. */
    7. public class Test {
    8. public static void main(String[] args){
    9. /* 模型可以重用*/
    10. IModel model = new ModelImpl();
    11. ViewTextAndControl viewText = new ViewTextAndControl();
    12. IController controller = new Controller();
    13. /*视图要委托给控制器处理请求,所以需要有个控制器的引用*/
    14. viewText.setController(controller);
    15. /*控制器选择模型去处理业务逻辑,所以需要有个模型的引用*/
    16. controller.setModel(model);
    17. /*为模型注册观察者,当模型变化时,及时通知给观察者*/
    18. model.registerObserver(viewText);
    19. /*创建一个swing视图*/
    20. ViewSwingAndControl viewSwing = new ViewSwingAndControl();
    21. IController controller2 = new Controller();
    22. viewSwing.setController(controller2);
    23. controller2.setModel(model);
    24. model.registerObserver(viewSwing);
    25. ViewHtml viewHtml = new ViewHtml();
    26. /*这个html视图,只接受模型的数据
    27. IController controller2 = new Controller();
    28. viewHtml.setController(controller2);
    29. controller2.setModel(model);
    30. */
    31. model.registerObserver(viewHtml);
    32. /*模拟视图层的操作*/
    33. /*
    34. Test t = new Test();
    35. t.test(viewText);
    36. */
    37. }
    38. private void test(ViewTextAndControl v){
    39. v.start(100);
    40. try {
    41. Thread.sleep(1000);
    42. v.add();
    43. Thread.sleep(1000);
    44. v.add();
    45. catch (InterruptedException e) {
    46. e.printStackTrace();
    47. }
    48. }
    49. }

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏