实验一 设计模式综合应用(一)附源码+UML图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注:班里的可以向我要工程文件
实验一设计模式综合应用(一)
一、实验目的:
熟练掌握Java设计模式中的命令模式和观察者模式,并培养学生将两者综合应用到具体软件项目中的能力。
二、实验内容:
制作如图1所示GUI界面,需求如下:
1. 鼠标左键点击界面时,在鼠标所在位置填充一个直径为20像素的圆,
并在界面上方的标签上显示“新增圆点位于:(x,y)”;
2. 鼠标右键点击时,则实现undo操作,将最后填充的圆点从界面中删除,
并在界面上方的标签上显示“删除圆点位于:(x,y)”;
3. 界面下方的标签随时显示“鼠标位于:(x,y)”;
图1 GUI界面
三、实验要求:
1. 绘制和撤销圆点使用命令模式;
2. 两个标签内容的变更使用观察者模式;
3. 在代码实现之前,进行UML类图设计;
4. 根据UML类图,在eclipse中编程实现程序的功能。
四、实验学时:2+2学时(课外2个学时)
五、提示:
1.设计一个Circle类,该类对象用来记录某个填充圆的信息;
2. 每填充一个圆点,就实例化一个Circle类对象,并将其放置到具体命令对
象关联的List对象中,用来作为undo操作的依据;
3. 填充圆可以使用Graphics的fillOval方法;
4. 删除圆可以先将Graphics对象的颜色设置为画布的背景色,再使用
Graphics的fillRect方法;
5. 标签显示内容的需求不用观察者模式就可以轻松实现,但要求使用观察者
模式进行设计;
5. 实验完成后,将UML文件和程序的工程文件打包,命名为“实验一.rar”,
并上传至ftp://10.10.3.72。
六UML图
七源代码
1.
package lsu.egg.sy1;
public class Circle {
private int x;
private int y;
Circle(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
2.
package lsu.egg.sy1; import javax.swing.JPanel; public interface Command {
public void excute(JPanel jpanel, Circle circle);
public void undo(JPanel jpanel);
}
3.
package lsu.egg.sy1;
import java.util.ArrayList;
import javax.swing.JPanel;
public class ConcreteCommand implements Command {
private Receiver receiver;
private ArrayList
private ConcreteOfInvoker concreteofinvoker;
ConcreteCommand(Receiver receiver, ConcreteOfInvoker concreteofinvoker) {
this.receiver = receiver;
this.arraylist = new ArrayList
this.concreteofinvoker = concreteofinvoker;
}
@Override
public void excute(JPanel jpanel, Circle circle) {
receiver.addSpot(jpanel, circle);
arraylist.add(circle);
}
@Override
public void undo(JPanel jpanel) {
Circle circle;
if(arraylist.size()>=1)
{
circle = arraylist.get(arraylist.size() - 1);
receiver.deleteSpotr(jpanel, circle);
arraylist.remove(arraylist.size() - 1);
int n = 2;
concreteofinvoker.notifyObservers(n, circle.getX(), circle.getY());
}
}
}
4.package lsu.egg.sy1;
import javax.swing.JLabel;
@SuppressWarnings("serial")