分享
 
 
 

用toy-code 演示MVC架构

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

先说说对MVC的理解:MVC是

Smalltalk时代就有的思想了,核心思想是把是把商业逻辑和数据显示分离开来,即,我写model(M)的代码时,只关心我要如何去干这件事,并不关心这件事以什么样的方式呈现给用户面前;相反,我的view(V)代码,只关心如何去显示,至于怎么干的,呵呵,不好意思,请问M吧 :P .有了干活的M, 有了搞宣传的V, 我们的C (Controller)负责指挥的老板, 可就轻松了多了~~

在一旁美美的品着咖啡,,,,,, 欣欣向荣的公司阿!

再拉一张清单出来:

C(Controller)负责指挥的老板,在Java GUI 中,往往由

XXXListener 充当.个人推荐,在C中建立M(model)和V(view)的关联,这样才显得很boss :P 而且有利于代码的维护. 在java Web 程序中,这一点由severlet 还充当;M(model)杰出的雇员,在Java GUI中,由继承了java.util.Observable的类来充当.当然我们可以不用java.tuil.Observable类定义自己的 model: 具体怎么做,请参考其源代码: http://javaresearch.gro.clinux.org/jdk140/index.html .特别是当我们的model 类必须继承某个类时,同时M保存着系统当前的状态并提供了改变系统状态的方法.在java Web中,这一点由JavaBean

充当;V(view)热情的宣传人员,在Java GUI中,由实现了借口java.util.Observer的类充当.Observer只是一个tagging Interface.在java Web中,这一点由JSP来承担;

那么这家公司是怎么运作的呢? C招聘来M和V,并制定好M和V的关系,当M开发出一个产品时,这是C就告诉与他相关的V, V就按照M的设计的产品给出一套合适的宣传画报.

[代码]

程序实现一个声控程序,很玩具的那种,主要是M(model)太笨 :P

我们先来看看C:

package com.cozmic.DesignPattern;

import javax.swing.*;

import java.awt.*;

public class VolumeController {

public static void main(String[] args) {

JFrame volumeFrame = new

JFrame(“Volume Frame”);

//定义model类(VolumeModel)

VolumeModel model = new VolumeModel();

//定义view类(VolumePanelView/VolumeSliderView)

VolumeSliderView sliderView = new

VolumeSliderView(model);

//建立model和view 的关联

model.addObserver(sliderView);

//定义view类(VolumePanelView/VolumeSliderView)

VolumePanelView panelView = new

VolumePanelView(model);

model.addObserver(panelView);

volumeFrame.setLayout(new

GridLayout(2,1));

volumeFrame.add(panelView.getComponent());

volumeFrame.add(sliderView.getComponent());

volumeFrame.setSize(200,200);

volumeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

volumeFrame.setVisible(true);

}

}

Controller 实现步骤:

定义model类(VolumeModel)定义view类(VolumePanelView/VolumeSliderView)建立model和view 的关联: model.addObserver(panelView);

再来看看M:

package com.cozmic.DesignPattern;

import java.util.Observable;

public class VolumeModel extends Observable {

private int volume = 10;

public int getVolume() {

return volume;

}

/**

* @param volume设置声音大小,最大100,最小0

* setChanged()和notifyObservers()是java.util.Observable 中的方法

* 当我们改变了M的状态必须调用这两个方法

*/

public void setVolume(int volume) {

if(volume >= 0 & volume <= 100)

{

this.volume = volume;

setChanged();

notifyObservers();

}

}

}

最后该我们的V了,代码给出了两个 View,

package com.cozmic.DesignPattern;

import java.util.Observer;

import java.util.Observable;

import javax.swing.*;

import java.awt.event.*;

public class VolumeSliderView implements Observer {

private JPanel volumePane = new JPanel();

private VolumeModel model;

private JScrollBar volumeScrollbar;

public VolumeSliderView(VolumeModel model) {

this.model = model;

volumeScrollbar = new

JScrollBar(JScrollBar.HORIZONTAL, 0, 0, 0, 100);

volumeScrollbar.addAdjustmentListener(new

SliderListener());

volumeScrollbar.setValue(model.getVolume());

volumePane.add(volumeScrollbar);

volumePane.setBorder(BorderFactory.createTitledBorder(“Volume Slider”));

}

//实现接口Observer中的方法

public void update(Observable m, Object args) {

int vtmp = ((VolumeModel) m).getVolume();

volumeScrollbar.setValue(vtmp);

}

public JComponent getComponent() {

return volumePane;

}

private class SliderListener implements AdjustmentListener {

public void

adjustmentValueChanged(AdjustmentEvent e) {

model.setVolume(volumeScrollbar.getValue());

}

}

}

---------

package com.cozmic.DesignPattern;

import java.util.Observer;

import java.util.Observable;

import javax.swing.*;

import java.awt.event.*;

import java.awt.BorderLayout;

public class VolumePanelView implements Observer {

private final VolumeModel model;

private JPanel volumePane = new JPanel();

private final JTextField volumeDisplay = new JTextField(15);

public VolumePanelView(final VolumeModel model) {

this.model = model;

volumeDisplay.setText(Integer.toString(model.getVolume()));

JPanel buttonPane = new JPanel();

JButton upButton = new

JButton(“Up”);

JButton downButton = new

JButton(“Down”);

volumeDisplay.setEditable(false);

upButton.addActionListener(new

ActionListener() {

public void

actionPerformed(ActionEvent e) {

int

vtmp = (new Integer(volumeDisplay.getText())).intValue();

model.setVolume(++vtmp);

}

});

downButton.addActionListener(new

ActionListener() {

public void

actionPerformed(ActionEvent e) {

int

vtmp = (new Integer(volumeDisplay.getText())).intValue();

model.setVolume( — vtmp);

}

});

volumePane.setLayout(new BorderLayout());

volumePane.add(volumeDisplay,BorderLayout.CENTER);

buttonPane.add(upButton);

buttonPane.add(downButton);

volumePane.add(buttonPane,BorderLayout.SOUTH);

volumePane.setBorder(BorderFactory.createTitledBorder(“Volume

Panel”));

}

//实现接口Observer中的方法

public void update(Observable m, Object args) {

int vtmp = ((VolumeModel) m).getVolume();

volumeDisplay.setText(Integer.toString(vtmp));

}

public JComponent getComponent() {

return volumePane;

}

}

[其他]

1.MVC的M层又划分为两块: Tools Model 和 Domain Model .有兴趣可以Google 一下~~~~

2.可以建立多个M和多个V的关联

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有