UML实验报告书实验3 设计模式

时间:2024.4.20

淮海工学院计算机工程学院

实验报告书

课程名:《UML理论及实践》   

题   目:        正向工程         

班   级:        Z121          

学   号:        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();

       }

}

更多相关推荐:
设计模式实验报告

设计模式实验指导书10学时教师张凯实验一工厂模式的应用实验目的1掌握工厂模式Factory的特点2分析具体问题使用工厂模式进行设计实验内容和要求有一个OEM制造商代理做HP笔记本电脑Laptop后来该制造商得到...

1099111130设计模式实验报告

哈尔滨工业大学华德应用技术学院实验报告课程名称软件设计模式系别计算机应用技术系专业软件工程学号1099111130姓名陈天任学期20xx年春季学期实验成绩计算机应用技术系监制123456789101112131...

设计模式实验报告

实验报告计算机科学与技术学院课程名称软件设计模式专业计算机科学与技术班级学号姓名实验一单例模式的应用1实验目的1掌握单例模式Singleton的特点2分析具体问题使用单例模式进行设计2实验内容和要求很多应用项目...

刘伟设计模式实验报告实验一

12实验1UML实验1实验学时2每组人数1实验类型31基础性2综合性3设计性4研究性实验要求11必修2选修3其它实验类别31基础2专业基础3专业4其它一实验目的1学会安装和使用建模工具PowerDesigner...

java设计模式实验报告

设计模式实验报告学院:学院专业:班姓名:学号:指导教师:一.实例实例:简单工厂模式使用简单工厂模式设计一个可以创建不同几何形状(圆形、方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和擦除eras…

设计模式上机实验二实验报告

设计模式实验二实验报告书专业班级软件0703学号3901070324姓名吉亚云指导老师刘伟时间20xx年4月24日中南大学软件学院1实验二设计模式上机实验二一实验目的使用PowerDesigner和任意一种面向...

数据库课程设计实验报告6

课程设计报告课程设计题目图书管理系统学生姓名易禄发专业网络工程班级10211302学号1021130207指导教师黄燕20xx年12月06日摘要数据库原理及应用课程设计是软件工程专业集中实践性环节之一是学习完数...

云大设计模式实验6(命令模式)

云南大学软件学院实验报告课程设计模式学期20xx20xx学年第一学期任课教师陆歌浩专业软件工程学号20xx1120xx7姓名孙金文成绩实验6命令模式一实验目的1熟悉命令模式2运用命令模式编制简单的java程序二...

设计模式实验1 策略模式

实验报告课程设计模式实验学期20xx20xx学年第一学期任课教师专业学号姓名成绩实验1策略模式1题目在教材25页上有一堆杂乱的类与接口选取自一个动作冒险游戏我们能看到代表游戏角色的类和角色可以使用的武器行为的类...

云大设计模式实验5(抽象工厂模式)

云南大学软件学院实验报告课程设计模式学期20xx20xx学年第一学期任课教师陆歌浩专业软件工程学号20xx1120xx7姓名孙金文成绩实验5抽象工厂模式一实验目的1熟悉抽象工厂模式2运用抽象工厂模式编制简单的j...

云大设计模式实验1(策略模式)

云南大学软件学院实验报告课程设计模式学期20xx20xx学年第一学期任课教师陆歌浩专业软件工程学号20xx1120xx7姓名孙金文成绩实验1策略模式一实验目的1熟悉策略模式2运用策略模式编制简单的java程序二...

《设计模式》实验指导书

哈尔滨理工大学计算机学院实验教学中心设计模式实验实验指导书3实验一Factory模式与AbstractFactory模式3实验二Adapter模式14实验三Observer模式18实验四Interpreter模...

设计模式实验报告(21篇)