Hier ist eine Zusammenfassung des ** Befehlsmusters ** im GoF-Entwurfsmuster.
Es ist ein einfaches Zeichenprogramm.
Eine Schnittstelle, die Anweisungen ausdrückt.
Command.java
package command;
public interface Command {
public abstract void execute();
}
Diese Klasse drückt "Anweisungen aus, die mehrere Anweisungen kombinieren".
MacroCommand.java
package command;
import java.util.Iterator;
import java.util.Stack;
public class MacroCommand implements Command {
//Anleitungsset
private Stack commands = new Stack();
public void execute() {
Iterator it = commands.iterator();
while (it.hasNext()) {
((Command) it.next()).execute();
}
}
//hinzufügen
public void append(Command cmd) {
if (cmd != this) {
commands.push(cmd);
}
}
//Letzte Anweisung löschen
public void undo() {
if (!commands.empty()) {
commands.pop();
}
}
//Alles löschen
public void clear() {
commands.clear();
}
}
Es ist eine Schnittstelle, die das "Zeichenziel" ausdrückt.
Drawable.java
package drawer;
public interface Drawable {
public abstract void draw(int x, int y);
}
Diese Klasse implementiert "Zeichenziel".
DrawCanvas.java
package drawer;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import command.MacroCommand;
public class DrawCanvas extends Canvas implements Drawable {
//Zeichnungsfarbe
private Color color = Color.red;
//Radius der zu zeichnenden Punkte
private int radius = 6;
//Geschichte
private MacroCommand history;
public DrawCanvas(int width, int height, MacroCommand history) {
setSize(width, height);
setBackground(Color.white);
this.history = history;
}
//Zeichnen Sie die gesamte Geschichte neu
public void paint(Graphics g) {
history.execute();
}
//Zeichnung
public void draw(int x, int y) {
Graphics g = getGraphics();
g.setColor(color);
g.fillOval(x - radius, y - radius, radius * 2, radius * 2);
}
}
Diese Klasse drückt "Punktzeichnungsbefehl" aus.
DrawCommand.java
package drawer;
import java.awt.Point;
import command.Command;
public class DrawCommand implements Command {
//Ziel zeichnen
protected Drawable drawable;
//Zeichenposition
private Point position;
public DrawCommand(Drawable drawable, Point position) {
this.drawable = drawable;
this.position = position;
}
public void execute() {
drawable.draw(position.x, position.y);
}
}
Diese Klasse führt die Hauptverarbeitung durch.
Main.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import command.Command;
import command.MacroCommand;
import drawer.DrawCanvas;
import drawer.DrawCommand;
public class Main extends JFrame implements ActionListener, MouseMotionListener, WindowListener {
//Geschichte zeichnen
private MacroCommand history = new MacroCommand();
//Zeichenbereich
private DrawCanvas canvas = new DrawCanvas(400, 400, history);
//Schaltfläche "Rückgängig"
private JButton undoButton = new JButton("undo");
//Schaltfläche Löschen
private JButton clearButton = new JButton("clear");
public Main(String title) {
super(title);
this.addWindowListener(this);
canvas.addMouseMotionListener(this);
undoButton.addActionListener(this);
clearButton.addActionListener(this);
Box buttonBox = new Box(BoxLayout.X_AXIS);
buttonBox.add(undoButton);
buttonBox.add(clearButton);
Box mainBox = new Box(BoxLayout.Y_AXIS);
mainBox.add(buttonBox);
mainBox.add(canvas);
getContentPane().add(mainBox);
pack();
show();
}
//Für ActionListener
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == undoButton) {
history.undo();
canvas.repaint();
} else if (source == clearButton) {
history.clear();
canvas.repaint();
}
}
//Für MouseMotionListener
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
Command cmd = new DrawCommand(canvas, e.getPoint());
history.append(cmd);
cmd.execute();
}
//Für WindowListener
public void windowClosing(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowClosed(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
public static void main(String[] args) {
new Main("Command Pattern Sample");
}
}
Durch Ausdrücken einer "Anweisung" als Objekt ist es möglich, eine Historie der Anweisung zu führen und die Anweisung erneut auszuführen. Wenn Sie eine neue "Anweisung" hinzufügen möchten, müssen Sie nur eine Klasse erstellen, die die Befehlsschnittstelle implementiert, wodurch die Funktionalität einfacher erweitert werden kann.
Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.
Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen der Entwurfsmuster und Beispielprogramme sind geschrieben. Schauen Sie sich also auch die Bücher an.
Recommended Posts