设计模式实战MVC模式Word格式文档下载.docx
- 文档编号:17556299
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:9
- 大小:55.77KB
设计模式实战MVC模式Word格式文档下载.docx
《设计模式实战MVC模式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《设计模式实战MVC模式Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
Observer模式允许某个对象在所观察的对象发生修改时通知多个观察者(Observer).
下面我们就以实例来讲解如何用Obserer模式实现MVC的程序结构。
在我的例子中,我要实现一个学生年龄显示的例子。
分别用清单和图形的方式显示每个学生的年龄。
当年龄改变时,自动更新显示。
Observer接口
为了实现观察的对象发生修改时通知多个观察者,通常要在被观察者与观察者之间有一个小的接口,如下:
/*
file:
Observer.java
*/
public
interface
Observer
{
void
dataUpdate(Model
model);
}
这个接口中有一个dataUpdate(Model
model)方法,只要实现了这个接口对象,就成了一个观察者。
模型Model
再来建立一个数据模型。
在我的例子中,先建立了一个数据对象:
Data.java
class
Data
int
value;
//
学生年龄值
String
name;
//
学生名
现在来建立一个Model:
Model.java
import
java.util.*;
Model
ArrayList
data
=
new
ArrayList();
observer
Model()
{
super();
Model(int[]
value,
String[]
name)
for
(
i
0;
i<
value.length;
i++
addData(value,name);
Model(Data[]
data)
data.length;
addData(data);
addData(int
Data
Data();
data.value
data.name
this.data.add(data);
addData(Data
getData(int
idx)
return
(Data)(data.get(idx));
size()
data.size();
用来向模型中登记观察者.
registerObserver(Observer
o)
observer.add(o);
removeObserver(Observer
observer.remove(o);
//
当数据改变时,由Controller调用此方法,通知各个Observer,刷新视图.
changeModel(Model
model)
data.clear();
(int
i=0;
MODEL.SIZE();
&
NBSP;
I++&
this.addData(model.getData(i));
dataUpdate();
private
dataUpdate()
(Iterator
observer.iterator();
i.hasNext();
Observer
o
(Observer)(i.next());
o.dataUpdate(this);
这个模型提供各种数据访问的方法。
并提供一个changeModel(Model
model)方法供Controller访问。
还提供一个registerObserver(Observer
o)方法,用来向Model中登记观察者Observer。
视图View
我们要实现一个清单显示样式的视图View1和一个图形方式显示的视图View2,并让它们实现Observer接口,以便当Model数据改变时,自动刷新自己.
View1.java
javax.swing.*;
java.awt.*;
javax.swing.border.*;
View1
extends
JPanel
implements
Model
model;
View1()
View1(Model
try
this.model
jbInit();
catch(Exception
e)
e.printStackTrace();
jbInit()
throws
Exception
this.setBackground(Color.white);
this.setBorder(new
TitledBorder(BorderFactory.createLineBorder(Color.black,1),"
View1"
);
paintComponent(Graphics
g)
super.paintComponent(g);
if
model
==
null
return;
x
20,y
50;
h
g.getFontMetrics().getHeight();
model.size();
model.getData(i);
g.drawString(data.name,x,y);
y+=h;
g.drawString(String.valueOf(data.value),x,y);
当模型数据发生改变时,会自动调用此方法来刷新图形
/**@todo:
Implement
this
method*/
repaint();
View2.java
View2
View2()
View2(Model
width
this.getWidth();
height
this.getHeight();
sy
/
sx
width/
2;
value
data.value;
dx
3;
r
Color
c
Color((int)(255*Math.random()),(int)(255*Math.random()),(int)(255*Math.random()));
cx
sx;
cy
y+i
*
sy;
j=0;
j<
VALUE;
J++&
g.setColor(c);
g.drawOval(cx,cy,r,r);
r+=dx;
g.drawString(data.name,25,cy);
控制器Controller
好了,MVC中的Model,Observer都建立好了,我们最后来做一个Controller:
java.awt.event.*;
Controller
JFrame
Model();
view1
View1(model);
view2
View2(model);
JScrollPane
jScrollPane1
JScrollPane();
JButton
jButton1
JButton();
JTextField
jTextField1
JTextField();
jTextField2
JLabel
jLabel1
JLabel();
jLabel2
jLabel3
Controller()
Data[]
Data[2];
data[0]
data[1]
data[0].name
"
Ted"
;
data[0].value
20;
data[1].name
Joy"
data[1].value
14;
model.addData(data[0]);
model.addData(data[1]);
注意下面两行:
向模型中登记它的观察者View1和View2.
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()
actionPerformed(ActionEvent
jButton1_actionPerformed(e);
});
jTextField1.setText("
20"
jTextField1.setBounds(new
Rectangle(80,
254,
52,
30));
jTextField2.setText("
14"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 实战 MVC