java之命令模式

命令模式

定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

角色

在这里插入图片描述

  1. Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
  2. ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
  3. Client类:最终的客户端调用类。
  4. Invoker类:调用者,负责调用命令。
  5. Receiver类:接收者,负责接收命令并且执行命令。

示例

调用者,持有命令对象

public class MyInvoker {

	private Command command;

	
	public Command getCommand() {
		return command;
	}


	public void setCommand(Command command) {
		this.command = command;
	}


	public void invoke(){
		command.action();
	}
}

命令接口,一个命令对应一个事件

public interface Command {

	public void action();
}

命令实现A,持有接收者对象

public class CommandImplA implements Command{

	private MyReceiver receiver;
	public CommandImplA(MyReceiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void action() {
		this.receiver.executeA();
	}

}

命令实现B

public class CommandImplB implements Command {

	private MyReceiver receiver;
	public CommandImplB(MyReceiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void action() {
		this.receiver.executeB();
	}

}

命令实现C

public class CommandImplC implements Command {

	private MyReceiver receiver;
	public CommandImplC(MyReceiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void action() {
		this.receiver.executeC();
	}

}

接受者,主要负责执行事件

public class MyReceiver {

	public void executeA(){
		System.out.println("执行A事件");
	}
	
	public void executeB(){
		System.out.println("执行B事件");
	}
	
	public void executeC(){
		System.out.println("执行C事件");
	}
}

测试类

public class CommandTest {

	public static void main(String[] args) {
		MyInvoker myInvoker = new MyInvoker();
		MyReceiver myReceiver = new MyReceiver();
		myInvoker.setCommand(new CommandImplA(myReceiver));
		myInvoker.invoke();
		myInvoker.setCommand(new CommandImplB(myReceiver));
		myInvoker.invoke();
		myInvoker.setCommand(new CommandImplC(myReceiver));
		myInvoker.invoke();
	}
}

分析

可参考

  1. Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。
  2. 实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。
  3. 通过使用Compmosite模式,可以将多个命令封装为一个“复合命令”MacroCommand。
  4. Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。
  5. 使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值