淮海工学院计算机工程学院
实验报告书
课程名:《UML理论及实践》
题 目: 正向工程
班 级: Z计121
学 号: 2014140093
姓 名: 薛慧君
一、目的与要求
1、熟悉面向对象原则,熟悉GoF中的模式;
2、会初步使用设计模式解决实际问题;
3、掌握正向工程、逆向工程概念;
4、掌握使用Rose画出类图、交互图等来描述设计模型;
5、掌握使用Rose从设计模型使用正向工程,得到代码框架;
6、掌握使用Rose从代码使用逆向工程,得到设计模型,并文档化Project。
二、实验内容或题目
假设有一CAD系统,可能需要绘制处理若干图形(如矩形、圆形、三角形……);而画图程序有若干版本,画图的工作需要依赖于具体的机器型号,新机器可以使用新的画图程序,旧的机器只能使用老版本的程序,请使用桥模式为本系统设计一个方案:请在Rational Rose中给出设计类图,并使用正向工程生成代码框架;在生成的代码中修改后再使用逆向工程,重新生成设计模型。
三、实验步骤及结果
CAD系统设计模型的类图;
四、结果分析与实验体会
通过本次实验,我掌握了:
(1) 桥模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
(2) 桥模式适用性:①不希望在抽象和实现部分之间有一个固定的绑架关系②类的抽象以及实现都可以通过生成子类的方法加以扩充③对抽象的实现部分的修改应不会对客户产生影响④对客户完全隐藏抽象的实现⑤有许多类要生成⑥在多个对象间共享实现,同时对客户隐藏这种实现机制
(3) 桥模式实现要点:分别定义抽象的接口和实现的接口,抽象接口中聚合一个实现接口的引用,该引用就是连接接口和实现的桥梁。
第二篇:实验一 设计模式综合应用(一)附源码+UML图
注:班里的可以向我要工程文件
实验一 设计模式综合应用(一)
一、实验目的:
熟练掌握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<Circle> arraylist;
private ConcreteOfInvoker concreteofinvoker;
ConcreteCommand(Receiver receiver, ConcreteOfInvoker concreteofinvoker) {
this.receiver = receiver;
this.arraylist = new ArrayList<Circle>();
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")
public class ConcreteObserver1 extends JLabel implements Observer {
ConcreteObserver1() {
super("新增圆点位于:(0,0)");
}
@Override
public void update(int n, int x, int y) {
if(n==1)
{
this.setText("新增圆点位于:(" + x + "," + y + ")");
}
else if(n==2)
{
this.setText("删除圆点位于:(" + x + "," + y + ")");
}
}
}
5. package lsu.egg.sy1;
import javax.swing.JLabel;
@SuppressWarnings("serial")
public class ConcreteObserver2 extends JLabel implements Observer {
@Override
public void update(int n, int x, int y) {
this.setText("鼠标位于:(" + x + "," + y + ")");
}
}
6.
package lsu.egg.sy1;
public interface ConcreteOfInvoker {
public void notifyObservers(int n, int x ,int y);
}
7.
package lsu.egg.sy1;
import java.util.ArrayList;
public class ConcreteSubject implements ConcreteOfInvoker, Subject {
ArrayList<Observer> arraylist;
ConcreteSubject() {
arraylist = new ArrayList<Observer>();
}
@Override
public void addObserver(Observer observer) {
arraylist.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
arraylist.remove(observer);
}
@Override
public void notifyObservers(int n, int x ,int y) {
for(Observer observer : arraylist)
{
observer.update(n, x ,y);
}
}
}
8.
package lsu.egg.sy1;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Invoker extends JPanel {
private Command command;
private ConcreteOfInvoker concreteofinvoker;
Invoker(Command command, ConcreteOfInvoker concreteofinvoker) {
this.command = command;
this.concreteofinvoker = concreteofinvoker;
this.addMouseListener(new Mouse());
this.addMouseMotionListener(new MouseMotion());
}
class Mouse implements MouseListener {
@Override
public void mouseClicked(MouseEvent arg0) {
excuteCommand(arg0);
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
}
class MouseMotion implements MouseMotionListener {
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void mouseMoved(MouseEvent arg0) {
int n = 0;
concreteofinvoker.notifyObservers(n, arg0.getX(), arg0.getY());
}
}
public void excuteCommand(MouseEvent mouseevent) {
int x = mouseevent.getX();
int y = mouseevent.getY();
Circle circle = new Circle(x, y);
if(mouseevent.getButton()==MouseEvent.BUTTON1)
{
this.command.excute(this, circle);
int n = 1;
concreteofinvoker.notifyObservers(n, mouseevent.getX(), mouseevent.getY());
}
else if(mouseevent.getButton()==MouseEvent.BUTTON3)
{
this.command.undo(this);
}
}
}
9.
package lsu.egg.sy1;
public interface Observer {
public void update(int n, int x, int y);
}
10.
package lsu.egg.sy1;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
public class Receiver {
private Graphics2D graphics2D;
public void addSpot(JPanel jpanel, Circle circle) {
Shape shape = new Ellipse2D.Double(circle.getX()-10, circle.getY()-10, 20, 20);
graphics2D = (Graphics2D) jpanel.getGraphics();
graphics2D.setPaint(Color.black);
graphics2D.fill(shape);
}
public void deleteSpotr(JPanel jpanel, Circle circle) {
Shape shape = new Ellipse2D.Double(circle.getX()-10, circle.getY()-10, 20, 20);
graphics2D = (Graphics2D) jpanel.getGraphics();
graphics2D.setPaint(jpanel.getBackground());
graphics2D.fill(shape);
}
}
11.
package lsu.egg.sy1;
public interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
}
12.
package lsu.egg.sy1;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Test extends JFrame{
Test() {
Receiver receiver = new Receiver();
ConcreteSubject concretesubject = new ConcreteSubject();
Command command = new ConcreteCommand(receiver, concretesubject);
Invoker invoker = new Invoker(command, concretesubject);
ConcreteObserver1 concreteobserver1 = new ConcreteObserver1();
ConcreteObserver2 concreteobserver2 = new ConcreteObserver2();
concretesubject.addObserver(concreteobserver1);
concretesubject.addObserver(concreteobserver2);
this.add("North", concreteobserver1);
this.add("South", concreteobserver2);
this.add("Center", invoker);
this.setSize(800, 600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Test();
}
}