一.内容说明
制作如图所示GUI界面,需求如下:
1.鼠标左键点击界面时,在鼠标所在位置填充一个直径为20像素的圆,并在界面上方的标签上显示“新增圆点位于:(x,y)”;
2.鼠标右键点击时,则实现undo操作,将最后填充的圆点从界面中删除,并在界面上方的标签上显示“删除圆点位于:(x,y)”;
3.界面下方的标签随时显示“鼠标位于:(x,y)”。
要求:1.绘制和撤销圆点使用命令模式;
2.两个标签内容的变更使用观察者模式;。
二.设计类图
三.全部类代码
首先设计一个Circle类,该类对象用来记录鼠标位置以及圆的位置信息,每填充一个圆点,就实例化一个Circle类对象,并将其放置到具体命令对象关联的List对象中,用来作为undo操作的依据;
然后设计一个Command抽象命令类,里面包含execute和undo抽象方法,具体命令LeftCommand类实例化Command类,在LeftCommand类中实现对填充以及删除圆点的具体操作,然后设计一个接受者类Receive,它是真正执行命令的对象,Invoker类用于命令对象执行请求,这是客户端真正出发命令并要求命令执行相应操作的地方。
再设计一个抽象观察者Observer类,里面定义抽象方法update类,然后设计两个具体观察者类ConcreteObserver和ConcreteObserver2,ConcreteObserver类用于记录新增及删除的圆点位置,ConcreteObserver2类用于记录鼠标的位置;再设计一个被观察者的抽象类Subject,里面包含两个抽象方法addObserver和deleteObserver,最后设计一个具体被观察者类去实现者两个抽象方法。
//Circle类:
package demo4;
public class Circle {
private int x;
private int 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;
}
public Circle(int x, int y) {
this.x = x;
this.y = y;
}
}
//抽象命令类:
import javax.swing.*;
public interface Command {
void execute(JPanel jPanel, Circle circle);
void undo(JPanel jPanel);
}
//具体命令类:
import javax.swing.*;
import java.util.ArrayList;
public class LeftCommand implements Command {
private Receiver receiver;
private ArrayList<Circle> arrayList;
private ConcreteOfInvoke concreteOfInvoke;
public LeftCommand(Receiver receiver, ArrayList<Circle> arrayList, ConcreteOfInvoke concreteOfInvoke) {
this.receiver = receiver;
this.arrayList = arrayList;
this.concreteOfInvoke = concreteOfInvoke;
}
@Override
public void execute(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