当前位置:文档之家› 实验一 设计模式综合应用(一)附源码+UML图

实验一 设计模式综合应用(一)附源码+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;}@Overridepublic void excute(JPanel jpanel, Circle circle) {receiver.addSpot(jpanel, circle);arraylist.add(circle);}@Overridepublic 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)");}@Overridepublic 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 { @Overridepublic 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>();}@Overridepublic void addObserver(Observer observer) {arraylist.add(observer);}@Overridepublic void deleteObserver(Observer observer) { arraylist.remove(observer);}@Overridepublic 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) {mand = command;this.concreteofinvoker = concreteofinvoker;this.addMouseListener(new Mouse());this.addMouseMotionListener(new MouseMotion());}class Mouse implements MouseListener {@Overridepublic void mouseClicked(MouseEvent arg0) {excuteCommand(arg0);}@Overridepublic void mouseEntered(MouseEvent arg0) { // TODO 自动生成的方法存根}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO 自动生成的方法存根}@Overridepublic void mousePressed(MouseEvent arg0) { // TODO 自动生成的方法存根}@Overridepublic void mouseReleased(MouseEvent arg0) { // TODO 自动生成的方法存根}}class MouseMotion implements MouseMotionListener {@Overridepublic void mouseDragged(MouseEvent arg0) {// TODO 自动生成的方法存根}@Overridepublic 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){mand.excute(this, circle);int n = 1;concreteofinvoker.notifyObservers(n, mouseevent.getX(), mouseevent.getY());}else if(mouseevent.getButton()==MouseEvent.BUTTON3){mand.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();} }。

相关主题