Solo  当前访客:0 开始使用

Nick1407 的个人博客

公众号:JavaCase

设计模式【命令模式】


一、概述
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。

image.png
在命令模式结构图中包含如下几个角色:
1、Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
2、ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)。
3、Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
4、Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

二、示例

1、功能概述:快捷键功能绑定。
image.png

2、UML图

image.png

3、代码

抽象命令类:

abstract class Command {

	public abstract void execute();
}

具体命令类:

public class MinimizeCommand  extends Command {

	private WindowHanlder whObj;//维持对请求接收者的引用


	public MinimizeCommand() {
		whObj = new WindowHanlder();
	}

	//命令执行方法,将调用请求接收者的业务方法
	public void execute() {
		whObj.minimize();
	}

}

请求发送者:

public class FunctionButton {

	private String name; //功能键名称

	private Command command; //维持一个抽象命令对象的引用


	public FunctionButton(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	//为功能键注入命令
	public void setCommand(Command command) {
		this.command = command;
	}//发送请求的方法

	public void onClick() {
		System.out.print("点击:"+name);
		command.execute();
	}
}

请求接收者:

public class WindowHanlder {
	public void minimize(){
		System.out.println("将窗口最小化至托盘!");
	}
}

功能设置类:

public class FBSettingWindow {

	private String title; //窗口标题
	// 定义一个ArrayList来存储所有功能键
	private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();

	public FBSettingWindow(String title) {
		this.title = title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getTitle() {
		return this.title;
	}

	public void addFunctionButton(FunctionButton fb) {
		functionButtons.add(fb);
	}

	public void removeFunctionButton(FunctionButton fb) {
		functionButtons.remove(fb);
	}

	//显示窗口及功能键
	public void display() {
		System.out.println("显示窗口:" + this.title);
		System.out.println("显示功能键:");
		for (Object obj : functionButtons) {
			System.out.println(((FunctionButton) obj).getName());
		}
		System.out.println("------------------------------");
	}
}

测试:

public class Test {
	public static void main(String[] args) {
		FBSettingWindow fbsw=new FBSettingWindow("功能键设置");
		FunctionButton fb1,fb2,fb3;
		fb1=new FunctionButton("功能键1");
		Command command1;
		command1= new MinimizeCommand();
		//将命令对象注入功能键
		fb1.setCommand(command1);
		fbsw.addFunctionButton(fb1);
		fbsw.display();
		//调用功能键的业务方法
		fb1.onClick();
	}
}

返回结果:
image.png

0 0