实验二 策略模式、观察者模式和组合模式
一、实验目的:
(1)学习和掌握策略模式;
(2)学习和掌握观察者模式;
(3)学习和掌握组合模式;
(4)学习和掌握使用这些模式解决实际问题;
二、实验内容
1. 请使用策略模式实现下列编程要求:已知几何形状家族有圆形、矩形、椭圆
形、三角形等形状。请用 Java 语言定义一个抽象类 MyShape 表示形状这样概念,
MyShape 抽象类中提供了计算面积、周长、显示形状信息的抽象方法,然后分别
定义它的子类 MyCircle(圆形)、MyRectangle(矩形)、MyEllipse(椭圆形)、
MyTriangle(三角形)等特定几何形状。并绘制这些定义的几何家族的所有形状。
2.请用观察者模式实现功能:学校发布信息,学生可以订阅,老师可以订阅,
行政人员也可以订阅。提示:定义主题接口,观察者接口,定义 Notice、学生、
老师和行政人员类,定义测试类。其中 Notice 类实现主题接口,老师、学生和
行政人员实现观察者接口。思考,如果要求实现学生和老师均可以订阅多个信息,
即除了订阅学校发布信息,也可以订阅所属系发送的信息,请编程实现。
3.定义一个游戏地图。地图是由每个方块拼合起来。地图上有墙等障碍物,也
有可以通行的基本图元构成。请使用组合模式,绘制一个游戏地图,地图的内容
自行定义,也可以类似图 3 形式:
图 3 游戏地图
4.已知有一个二维数组数据如图 1 所示,请结合策略模式、观察者模式和组合
模式实现一个 MVC 结构的应用程序。要求:如果用户移动滑块,可以修改二维
数组的值,并在运行的用户界面中显示出来。其中,饼状图和柱状图中的区域分
布为二位数组每一维的总和。运行结果如图 4 和图 5 所示。
60 50 90
90 40 30
10 20 70
图 4 数据模型
图 5 运行结果
三、实验环境
1、PC微机;
2、DOS操作系统或 Windows 操作系统;
3、jdk程序集成环境Eclipse
四、源代码、测试结果及 UML 图
一: 图
2. 源程序代码:
package ;
import ;
import ;
import ;
import ;
//绘制所有图形
@SuppressWarnings("serial")
public class DrawShape extends JPanel{
private List<MyShape> shapes;
public DrawShape() {
shapes=new ArrayList<MyShape>();
}
DrawShape
-shapes:Li st<MyShape>
+DrawShape()
+addShape(shape:MyShap
e):void
+pai ntComponent ( g: Gr
aphi cs) : voi d
MyShape
+area():float
+perimeter():float
+draw(g:Graphics):
void
MyCircle
-PI:float=
-radius:int
-x:int
-y:int
+MyCircle(x:int,y:
int,radius:int)
+area():float
+perimeter():float
+draw(g:Graphics)
:void
+toString():String
MyRectangle
-width:int
-height:int
-x:int
-y:int
+MyRectangle(widt
h:int,height:int,x:int,
y:int)
+area():float
+perimeter():float
+draw(g:Graphics):
void
+toString():String
MyEllipse
-PI:float=
-aLong:int
-bShort:int
-x:int
-y:int
+MyEllipse(aLong:in
t,bShort:int,x:int,y:int
)
+area():float
+perimeter():float
+draw(g:Graphics):v
oid
+toString():String
MyTriangle
-xPoints[]:int
-yPoints[]:int
-a:int -b:int
-c:int -n:int
+MyTriangle(xPoin
ts[]:int,yPoints[]:int,
a:int,b:int,c:int,n:int
)
+area():float
+perimeter():float
+draw(g:Graphics):
void
+toString():String
public void addShape(MyShape shape){ //添加图形
if(shape!=null) (shape);
}
public void paintComponent(Graphics g){ //依次绘制图形
for(MyShape ms:shapes){
(g);
(ms);
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
//形状家族
public abstract class MyShape {
public abstract float area();
public abstract float perimeter();
public abstract void draw(Graphics g);
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
//圆形
public class MyCircle extends MyShape {
private static final float PI=;
private int radius; //定义圆形半径
private int x,y; //定义起点(x,y)坐标
public MyCircle(int x,int y,int radius){ //构造函数
super();
=x;
=y;
= radius;
}
@Override
public float area() { //求面积
// TODO 自动生成的方法存根
return PI*radius*radius;
}
@Override
public float perimeter() { //求周长
// TODO 自动生成的方法存根
return 2*PI*radius;
}
@Override
public String toString() {
return "MyCircle [radius=" + radius + ", x 坐标=" + x + ", y 坐标=" + y + "]"+
" 面积="+area()+",周长="+perimeter();
}
@Override
public void draw(Graphics g) { //绘制图形
// TODO 自动生成的方法存根
();
(x, y, 2*radius, 2*radius);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
//矩形
public class MyRectangle extends MyShape {
private int x,y; //定义起点(x,y)坐标
private int width,height; //定义矩形的宽和高
public MyRectangle(int x,int y,int width, int height) {
super();
=x;
=y;
= width;
= height;
}
@Override
public float area() {
// TODO 自动生成的方法存根
return width*height;
}
@Override
public float perimeter() {
// TODO 自动生成的方法存根
return 2*(width+height);
}
@Override
public String toString() {
return "MyRectangle [x 坐标=" + x + ", y 坐标=" + y + ", 矩形宽=" + width
+ ", 矩形高=" + height + "]"+" 面积="+area()+",周长="+perimeter();
}
@Override
public void draw(Graphics g) {
// TODO 自动生成的方法存根
();
(x, y, width, height);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
//椭圆形
public class MyEllipse extends MyShape {
private static final float PI=;
private int x,y; //定义起点(x,y)坐标
private int aLong,bShort; //定义椭圆的长轴和短轴
public MyEllipse(int x, int y,int aLong, int bShort) {
super();
= x;
= y;
= aLong;
= bShort;
}
@Override
public float area() {
// TODO 自动生成的方法存根
return
}
@Override
public float perimeter() {
// TODO 自动生成的方法存根
return PI*bShort+2*(aLong-bShort);
}
@Override
public String toString() {
return "MyEllipse [x 坐标=" + x + ", y 坐标=" + y + ", 长轴=" + aLong
+ ", 短轴=" + bShort + "]"+" 面积="+area()+",周长="+perimeter();
}
@Override
public void draw(Graphics g) {
// TODO 自动生成的方法存根
();
(x, y, aLong, bShort);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
//三角形
public class MyTriangle extends MyShape {
private int a,b,c,n;
private int[] xPoints;
private int[] yPoints;
public MyTriangle( int[] xPoints, int[] yPoints,int n,int a,int b,int c) {
super();
= xPoints;
= yPoints;
= n;
=a; =b; =c;
}
@Override
public float area() {
// TODO 自动生成的方法存根
float p=(a+b+c)/2;
return (float)(p*(p-a)*(p-b)*(p-c));
}
@Override
public float perimeter() {
// TODO 自动生成的方法存根
return a+b+c;
}
@Override
public String toString() {
return "MyTriangle [a=" + a + ", b=" + b + ", c=" + c + "]"+
" 面积="+area()+",周长="+perimeter();
}
@Override
public void draw(Graphics g) {
// TODO 自动生成的方法存根
();
(xPoints, yPoints, n);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
//测试程序
public class Test { //测试绘制所有形状
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
JFrame frame=new JFrame();
DrawShape ds=new DrawShape();
(new MyCircle(20,20,60));
(new MyRectangle(200,20,120,100));
(new MyEllipse(40,200,150,100));
int xPoints[]={300,240,370};
int yPoints[]={200,280,300};
(new MyTriangle(xPoints,yPoints,3,9,12,15));
().add(ds);
("绘制图形演示");
(500,400);
(true);
(_ON_CLOSE);
}
}
3. 测试结果图:
二: 图:
Subject
+registerObserver(ob
server:Observer):void
+removeObserver(ob
server:Observer):void
+notifyAllObservers(
):void
Observer
+getNotice(message:St
ring):void
DepartmentNotice
-observers:List<Observer>
-message:String
+DepartmentNotice()
+registerObserver(obser
ver:Observer):void
+removeObserver(obser
ver:Observer):void
+notifyAllObservers():v
oid
+setMessage
(str:String):void
+getMessage():String
Notice
-observers:List<Observer>
-message:String
+Notice()
+registerObserver(obser
ver:Observer):void
+removeObserver(obser
ver:Observer):void
+notifyAllObservers():v
oid
+setMessage
(str:String):void
+getMessage():String
Teacher
+getNotice(mess
age:String):void
Student
+getNotice(mess
age:String):void
Administrator
+getNotice(mess
age:String):void
2.源代码:
package ;
//主题
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyAllObservers();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//学校通知
public class Notice implements Subject {
private List<Observer> observers;
private String message;
public Notice(){
observers=new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
// TODO 自动生成的方法存根
if(!(observer))
(observer);
}
@Override
public void removeObserver(Observer observer) {
// TODO 自动生成的方法存根
if((observer))
(observer);
}
@Override
public void notifyAllObservers() {
// TODO 自动生成的方法存根
for(Iterator<Observer> it=();();){
Observer o=();
(getMessage());
}
}
public void setMessage(String str){
=str;
}
public String getMessage(){
return message;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//学院通知
public class DepartmentNotice implements Subject {
private List<Observer> observers;
private String message;
public DepartmentNotice(){
observers=new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
// TODO 自动生成的方法存根
(observer);
}
@Override
public void removeObserver(Observer observer) {
// TODO 自动生成的方法存根
(observer);
}
@Override
public void notifyAllObservers() {
// TODO 自动生成的方法存根
for(Iterator<Observer> it=();();){
Observer o=();
(getMessage());
}
}
public void setMessage(String str){
=str;
}
public String getMessage(){
return message;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
//观察者
public interface Observer {
public void getNotice(String message);
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
//具体观察者,教师
public class Teacher implements Observer {
@Override
public void getNotice(String message) {
// TODO 自动生成的方法存根
("教师收到通知:"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
//具体观察者,学生
public class Student implements Observer {
@Override
public void getNotice(String message) {
// TODO 自动生成的方法存根
("学生收到通知:"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
//具体观察者,行政人员
public class Administrator implements Observer {
@Override
public void getNotice(String message) {
// TODO 自动生成的方法存根
("行政人员收到通知:"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
//测试程序
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Notice notice=new Notice();
DepartmentNotice depart=new DepartmentNotice();
Observer tea,stu,admin;
tea=new Teacher();
stu=new Student();
admin=new Administrator();
(tea);
(stu);
(admin);
(tea);
(stu);
("学校通知:五一全体放假七天。。。。");
("学院通知:这个礼拜周末补课,请各位做好心里准备。。。");
();
();
();
();
(tea);
();
}
}
3.测试结果图:
三: 图
2.源代码
package ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public abstract class GameComponent extends JPanel{
public abstract void paintComponent(Graphics g);
public Dimension getPreferredSize(){
return new Dimension(50,50);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class Grass extends GameComponent {
private ImageIcon icon;
GameComponent
+paintComponent(g:Gra
phics):void
+getPreferredSize():Dim
ension
Grass
-icon:ImageIcon
-image:Image
+Grass()
+paintComponent(g:
Graphics):void
Tree
-icon:ImageIcon
-image:Image
+Tree()
+paintComponent(g:Gra
phics):void
Road
-icon:ImageIcon
-image:Image
+Road()
+paintComponent(g:Grap
hics):void
House Wall
-icon:ImageIcon
-image:Image
+House()
+paintComponent(g:Grap
hics):void
-icon:ImageIcon
-image:Image
+Wall()
+paintComponent(g:Grap
hics):void
private Image image;
public Grass(){
setBorder(());
icon=new ImageIcon("src/images/");
image=();
}
@Override
public void paintComponent(Graphics g) {
// TODO 自动生成的方法存根
(image,0,0,getWidth(),getHeight(),this);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class House extends GameComponent {
private ImageIcon icon;
private Image image;
public House(){
icon=new ImageIcon("src/images/");
image=();
}
@Override
public void paintComponent(Graphics g) {
// TODO 自动生成的方法存根
(image,0,0,getWidth(),getHeight(),this);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class Tree extends GameComponent {
private ImageIcon icon;
private Image image;
public Tree(){
icon=new ImageIcon("src/images/");
image=();
}
@Override
public void paintComponent(Graphics g) {
// TODO 自动生成的方法存根
(image,0,0,getWidth(),getHeight(),this);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class Wall extends GameComponent{
private ImageIcon icon;
private Image image;
public Wall(){
icon=new ImageIcon("src/images/");
image=();
}
@Override
public void paintComponent(Graphics g) {
// TODO 自动生成的方法存根
try{
image=(new File("src/images/"));
(image,0,0,getWidth(),getHeight(),this);
}catch(Exception e){
();
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class Road extends GameComponent {
private ImageIcon icon;
private Image image;
public Road(){
icon=new ImageIcon("src/images/");
image=();
}
@Override
public void paintComponent(Graphics g) {
// TODO 自动生成的方法存根
(image,0,0,getWidth(),getHeight(),this);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
import ;
//测试程序
@SuppressWarnings("serial")
public class Test extends JFrame {
private GridLayout layout;
private int[][] map={
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,3,0,0,2,0,0,0,0,0,2,0,0,3,1},
{1,3,0,0,0,1,1,3,1,1,0,0,0,3,1},
{1,0,0,4,0,0,0,0,0,0,0,4,0,0,1},
{1,0,1,0,1,1,1,0,1,1,1,0,1,0,1},
{1,0,1,0,0,3,0,0,0,3,0,0,1,0,1},
{1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,4,0,0,1,3,1,0,0,4,0,0,1},
{1,0,0,0,1,1,1,3,1,1,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,0,0,3,3,3,0,0,1,0,0,1},
{1,0,1,0,0,0,0,0,0,0,0,0,1,0,1},
{1,2,0,0,0,4,3,4,3,4,0,0,0,2,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
public Test(){
super("游戏地图演示");
Container container=getContentPane();
layout=new GridLayout(15,15);
(layout); //设置 15 行*15 列的网格布局
Color c=new Color(60,90,0);
(c); //设置窗口背景颜色
for(int i=0;i<();i++){
for(int j=0;j<();j++){
switch(map[i][j]){
case 0:(new Road());break;
case 1:(new Wall());break;
case 2:(new House());break;
case 3:(new Grass());;break;
case 4:(new Tree());break;
}
}
}
setSize(600,600);
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Test t=new Test();
(_ON_CLOSE);
}
}
3.测试结果图
四: 图
2.源代码
package ;
public interface Model {
public void setData(int index,int value);
public int[] getData();
public void addObserver(View o);
public void removeObserver(View o);
public void notifyObservers();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//数据模型
public class DataModel implements Model {
private int[] data; //一维数组
Model
+setData(index:int,value:in
t):void
+getData():int[]
+addObserver(o:View):voi
d
+removeObserver(o:View)
:void
+notifyObservers():void
View
+addView(v:View)void
+removeView(v:View)
void
+update(data:int[]):void
DataModel
-data:int[]
-observers:
List<View>
+DataModel()
+setData(index:int,value:i
nt):void
+getData():int[]
+addObserver(o:View):v
oid
+removeObserver(o:Vie
w):void
+notifyObservers():void
TableView
-data:int[]
-startX:int=20
-startY:int=20
+addView(v:View)
void
+removeView(v:Vi
ew)void
+update(data:int[]):
void
+paintComponent(
g:Graphics):void
PieView
-data:int[]
+addView(v:View)
void
+removeView(v:Vi
ew)void
+update(data:int[]):
void
+paintComponent(
g:Graphics):void
HistogramView
-data:int[]
-WIDTH:int=30
+addView(v:View
)void
+removeView(v:V
iew)void
+update(data:int[])
:void
+paintComponent(
g:Graphics):void
FrameView
-data:int[]
-views:
List<View>
+FrameView()
+addView(v:View)
void
+removeView(v:Vi
ew)void
+update(data:int[]):
void
FrameController
-FPS_MIN:int=0
-FPS_MAX:int=100
-FPS_INIT:int=50
-sliders:JSlider[]
-model:Model
+FrameController(m:
Model)
private List<View> observers; //观察者
public DataModel(){
observers=new ArrayList<View>();
data=new int[9];
for(int i=0;i<;i++){
data[i]=5;
}
}
@Override
public void setData(int index, int value) {
// TODO 自动生成的方法存根
[index]=value;
notifyObservers();
}
@Override
public void addObserver(View o) {
// TODO 自动生成的方法存根
if (o == null)throw new NullPointerException();
if (!(o))(o);
}
@Override
public void removeObserver(View o) {
// TODO 自动生成的方法存根
if((o)) (o);
}
@Override
public void notifyObservers() {
// TODO 自动生成的方法存根
for(Iterator<View> it=();();){
View observer=();
();
}
}
@Override
public int[] getData() {
// TODO 自动生成的方法存根
return data;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
public interface View {
public abstract void addView(View v); //添加视图
public abstract void removeView(View v); //删除视图
public abstract void update(int[] data); //更新视图
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//表格图
@SuppressWarnings("serial")
public class TableView extends JPanel implements View {
private int[] data={60,50,90,90,40,30,10,20,70};
private static final int startX=20;
private static final int startY=20;
public void paintComponent(Graphics g){
(g);
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
();
(startX+50*j,startY+50*i,50,50);
(" "+data[i*3+j], 45+50*j, 45+50*i);
}
}
}
@Override
public void addView(View v) {
// TODO 自动生成的方法存根
("不允许添加视图!");
}
@Override
public void removeView(View v) {
// TODO 自动生成的方法存根
("不允许操作!");
}
@Override
public void update(int[] data) {
// TODO 自动生成的方法存根
=data;
(); //更新视图
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//饼状图
public class PieView extends JPanel implements View {
private static final long serialVersionUID = 168680570258863781L;
private int[] data={60,50,90,90,40,30,10,20,70};
public void paintComponent(Graphics g){
(g);
int total=0;
for(int i=0;i<;i++){
total=total+data[i];
}
if(total==0){
();
(20, 50, 200, 200, 0, 360);
}
else{
int x=(data[0]+data[3]+data[6])*360/total;
int y=(data[1]+data[4]+data[7])*360/total;
();
(20, 50, 200, 200, 0, x);
();
(20, 50, 200, 200, x, y);
();
(20, 50, 200, 200, x+y, 360-x-y);
}
}
@Override
public void addView(View v) {
// TODO 自动生成的方法存根
("不允许添加视图!");
}
@Override
public void removeView(View v) {
// TODO 自动生成的方法存根
("不允许操作!");
}
@Override
public void update(int[] data) {
// TODO 自动生成的方法存根
=data;
(); //更新视图
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
//柱状图
@SuppressWarnings("serial")
public class HistogramView extends JPanel implements View {
private int[] data={60,50,90,90,40,30,10,20,70};
private static final int WIDTH=30; //矩形的宽设为固定的 30
public void paintComponent(Graphics g){
(g);
();
(20, 20, 20, 270);
(20, 270, 220,270 );
int heightX=(data[0]+data[3]+data[6]);
int heightY=(data[1]+data[4]+data[7]);
int heightZ=(data[2]+data[5]+data[8]);
(50, 270-heightX, WIDTH, heightX);
(110, 270-heightY, WIDTH, heightY);
(170, 270-heightZ, WIDTH, heightZ);
}
@Override
public void addView(View v) {
// TODO 自动生成的方法存根
("不允许添加视图!");
}
@Override
public void removeView(View v) {
// TODO 自动生成的方法存根
("不允许操作!");
}
@Override
public void update(int[] data) {
// TODO 自动生成的方法存根
=data;
(); //更新视图
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
@SuppressWarnings("serial")
public class FrameView extends JPanel implements View {
private List<View> views;
@SuppressWarnings("unused")
private int[] data;
public FrameView() {
views=new ArrayList<View>();
setLayout(null);
}
@Override
public void addView(View v) {
// TODO 自动生成的方法存根
if (v == null)throw new NullPointerException();
if (!(v)){
(v);
((JPanel)v);
}
}
@Override
public void removeView(View v) {
// TODO 自动生成的方法存根
if((v)) (v);
}
@Override
public void update(int[] data) {
// TODO 自动生成的方法存根
=data;
();
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
import ;
//控制器
@SuppressWarnings("serial")
public class FrameController extends JPanel{
private static final int FPS_MIN = 0;
private static final int FPS_MAX = 100;
private static final int FPS_INIT =50 ;
private JSlider[] sliders;
private Model model;
public FrameController(Model m) {
super();
=m;
sliders=new JSlider[9]; //控制器,滑块条
int[] data={60,50,90,90,40,30,10,20,70};
for(int i=0;i<;i++){
sliders[i]=new JSlider(,FPS_MIN, FPS_MAX, FPS_INIT);
sliders[i].setMajorTickSpacing(20);
sliders[i].setMinorTickSpacing(4);
sliders[i].setPaintTicks(true);
sliders[i].setPaintLabels(true);
sliders[i].setValue(data[i]); //为滑块设置一个初始值
sliders[i].setName(i+"");
add(sliders[i]);
sliders[i].addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
JSlider js=(JSlider)(); //获取当前操作的滑块
int index=(()); //获取当前对象的索引
(index,()); //修改模型
}});
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
package ;
import ;
import ;
import ;
import ;
//测试程序
@SuppressWarnings("serial")
public class Test extends JFrame {
private Model model;
private JPanel panel1,panel2,panel3;
private FrameView frameView;
private FrameController panel4;
public Test(){
super("MVC 测试");
Container container=getContentPane();
(null);
(0,0,800,600);
model=new DataModel();
frameView=new FrameView();
(0,0,800,300);
panel1=new TableView();
((View) panel1);
();
(20, 0, 240, 300);
panel2=new PieView();
((View) panel2);
();
(280,0,240, 300);
panel3=new HistogramView();
((View)panel3);
();
(540,0, 240,300);
panel4=new FrameController(model);
(80,320,620, 200);
((View)panel1); //添加观察者
((View)panel2);
((View)panel3);
(frameView);
(panel4);
setSize(800,600);
setVisible(true);
(_ON_CLOSE);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
new Test();
}
}
3.测试结果图