九. 命令模式和观察者模式

本文介绍如何运用命令模式和观察者模式来实现GUI交互,包括鼠标点击时填充圆点、撤销操作以及实时更新标签内容。通过Command抽象类、Receiver接受者类、Observer观察者类等设计,实现了组件之间的解耦合和状态的自动更新。
摘要由CSDN通过智能技术生成

一.内容说明

制作如图所示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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值