[JAVA] Entwurfsmuster ~ Befehl ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Befehlsmusters ** im GoF-Entwurfsmuster.

2. Was ist das Befehlsmuster?

3. Beispielklassendiagramm

Command.PNG

4. Beispielprogramm

Es ist ein einfaches Zeichenprogramm.

4-1. Befehlsschnittstelle

Eine Schnittstelle, die Anweisungen ausdrückt.

Command.java


package command;

public interface Command {
	public abstract void execute();
}

4-2. MacroCommand-Klasse

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();
	}
}

4-3. Zeichenbare Schnittstelle

Es ist eine Schnittstelle, die das "Zeichenziel" ausdrückt.

Drawable.java


package drawer;

public interface Drawable {
	public abstract void draw(int x, int y);
}

4-4. DrawCanvas-Klasse

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);
	}
}

4-5. DrawCommand-Klasse

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);
	}
}

4-6 Hauptklasse

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");
	}
}

4-7 Ausführungsergebnis

e.png

5. Vorteile

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.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

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

Entwurfsmuster ~ Befehl ~
Befehlsmuster
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Erinnerungsmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster