Command

1).下面以Boss和Clerk为例:

Clerk.java代码如下:

 

package com.flyingh.receiver;

public class Clerk {
	public void action() {
		System.out.println("**************");
	}
}

 

 Command.java代码如下:

 

package com.flyingh.icommand;

public interface Command {
	void execute();
}

 

 ConcreteCommand.java代码如下:

 

package com.flyingh.command;

import com.flyingh.icommand.Command;
import com.flyingh.receiver.Clerk;

public class ConcreteCommand implements Command {
	private Clerk clerk;

	public ConcreteCommand(Clerk clerk) {
		super();
		this.clerk = clerk;
	}

	@Override
	public void execute() {
		// TODO Auto-generated method s
		clerk.action();
	}

}

 

 Boss.java代码如下:

 

package com.flyingh.invoker;

import com.flyingh.icommand.Command;

public class Boss {
	private Command command;

	public Command getCommand() {
		return command;
	}

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

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

 

Client.java代码如下:

package com.flyingh.client;

import com.flyingh.command.ConcreteCommand;
import com.flyingh.icommand.Command;
import com.flyingh.invoker.Boss;
import com.flyingh.receiver.Clerk;

public class Client {
	public static void main(String[] args) {
		Boss boss = new Boss();
		Clerk clerk = new Clerk();
		Command command = new ConcreteCommand(clerk);
		boss.setCommand(command);
		boss.action();
	}
} 

程序运行结果如下:

 

**************

 2).下面以Invoker点击三个按钮(on,off,undo)来控制Light的on,off和undo为例,代码如下:

Command.java

 

package com.flyingh.icommand;

public interface Command {
	void execute();

	void undo();
}

 Light.java

 

package com.flyingh.receiver;

public class Light {

	public void on() {
		// TODO Auto-generated method stub
		System.out.println("turn on the light!");
	}

	public void off() {
		// TODO Auto-generated method stub
		System.out.println("turn off the light!");
	}

}

 LightOnCommand.java

 

package com.flyingh.command;

import com.flyingh.icommand.Command;
import com.flyingh.receiver.Light;

public class LightOnCommand implements Command {
	private Light light;

	public LightOnCommand(Light light) {
		super();
		this.light = light;
	}

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		light.on();
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		light.off();
	}

}

 LightOffCommand.java

 

package com.flyingh.command;

import com.flyingh.icommand.Command;
import com.flyingh.receiver.Light;

public class LightOffCommand implements Command {
	private Light light;

	public LightOffCommand(Light light) {
		super();
		this.light = light;
	}

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		light.off();
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		light.on();
	}

}

Invoker.java

package com.flyingh.invoker;

import com.flyingh.icommand.Command;

public class Invoker {
	private Command lightOnCommand;
	private Command lightOffCommand;
	private Command undoCommand;

	public Invoker() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Invoker(Command lightOnCommand, Command lightOffCommand) {
		super();
		this.lightOnCommand = lightOnCommand;
		this.lightOffCommand = lightOffCommand;
	}

	public void OnButtonClick() {
		lightOnCommand.execute();
		undoCommand = lightOnCommand;
	}

	public void OffButtonClick() {
		lightOffCommand.execute();
		undoCommand = lightOffCommand;
	}

	public void undoButtonClick() {
		undoCommand.undo();
	}
} 

Client.java

package com.flyingh.client;

import com.flyingh.command.LightOffCommand;
import com.flyingh.command.LightOnCommand;
import com.flyingh.invoker.Invoker;
import com.flyingh.receiver.Light;

public class Client {
	public static void main(String[] args) {
		Light light = new Light();
		LightOnCommand lightOnCommand = new LightOnCommand(light);
		LightOffCommand lightOffCommand = new LightOffCommand(light);
		Invoker invoker = new Invoker(lightOnCommand, lightOffCommand);
		invoker.OnButtonClick();
		invoker.OffButtonClick();
		invoker.undoButtonClick();
	}
} 

程序运行结果如下:

 

turn on the light!
turn off the light!
turn on the light!

3).一次打开或者关闭多个(宏命令):

Command.java

 

package com.flyingh.icommand;

public interface Command {
	void execute();

	void undo();
}

 

 Receiver.java

 

package com.flyingh.ireceiver;

public interface Receiver {
	void on();

	void off();
}

 

 MacroOnCommand.java

 

package com.flyingh.command;

import java.util.List;

import com.flyingh.icommand.Command;
import com.flyingh.ireceiver.Receiver;

public class MacroOnCommand implements Command {
	private List<Receiver> list;

	public MacroOnCommand(List<Receiver> list) {
		super();
		this.list = list;
	}

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		for (Receiver receiver : list) {
			receiver.on();
		}
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		for (Receiver receiver : list) {
			receiver.off();
		}
	}

}

 

 MacroOffCommand.java

 

package com.flyingh.command;

import java.util.List;

import com.flyingh.icommand.Command;
import com.flyingh.ireceiver.Receiver;

public class MacroOffCommand implements Command {
	private List<Receiver> list;

	public MacroOffCommand(List<Receiver> list) {
		super();
		this.list = list;
	}

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		for (Receiver receiver : list) {
			receiver.off();
		}
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		for (Receiver receiver : list) {
			receiver.on();
		}
	}

}

 

 Light.java

 

package com.flyingh.receiver;

import com.flyingh.ireceiver.Receiver;

public class Light implements Receiver {

	@Override
	public void on() {
		// TODO Auto-generated method stub
		System.out.println("turn on the light!");
	}

	@Override
	public void off() {
		// TODO Auto-generated method stub
		System.out.println("turn off the light!");
	}

}

 

 TV.java

 

package com.flyingh.receiver;

import com.flyingh.ireceiver.Receiver;

public class TV implements Receiver {

	@Override
	public void on() {
		// TODO Auto-generated method stub
		System.out.println("turn on the TV!");
	}

	@Override
	public void off() {
		// TODO Auto-generated method stub
		System.out.println("turn off the TV!");
	}

}

 

 Radio.java

 

package com.flyingh.receiver;

import com.flyingh.ireceiver.Receiver;

public class Radio implements Receiver {

	@Override
	public void on() {
		// TODO Auto-generated method stub
		System.out.println("turn on the radio!");
	}

	@Override
	public void off() {
		// TODO Auto-generated method stub
		System.out.println("turn off the radio!");
	}

}

 

 Invoker.java

 

package com.flyingh.invoker;

import com.flyingh.icommand.Command;

public class Invoker {
	private Command macroOnCommand;
	private Command macroOffCommand;
	private Command macroUndoCommand;

	public Invoker() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Invoker(Command lightOnCommand, Command lightOffCommand) {
		super();
		this.macroOnCommand = lightOnCommand;
		this.macroOffCommand = lightOffCommand;
	}

	public void onButtonClick() {
		macroOnCommand.execute();
		macroUndoCommand = macroOnCommand;
	}

	public void offButtonClick() {
		macroOffCommand.execute();
		macroUndoCommand = macroOffCommand;
	}

	public void undoButtonClick() {
		macroUndoCommand.undo();
	}
}

 

Client.java

 

package com.flyingh.client;

import java.util.ArrayList;
import java.util.List;

import com.flyingh.command.MacroOffCommand;
import com.flyingh.command.MacroOnCommand;
import com.flyingh.icommand.Command;
import com.flyingh.invoker.Invoker;
import com.flyingh.ireceiver.Receiver;
import com.flyingh.receiver.Light;
import com.flyingh.receiver.Radio;
import com.flyingh.receiver.TV;

public class Client {
	public static void main(String[] args) {
		Receiver light = new Light();
		Receiver tv = new TV();
		Receiver radio = new Radio();

		List<Receiver> list = new ArrayList<Receiver>();
		list.add(light);
		list.add(tv);
		list.add(radio);

		Command macroOnCommand = new MacroOnCommand(list);
		Command macroOffCommand = new MacroOffCommand(list);

		Invoker invoker = new Invoker(macroOnCommand, macroOffCommand);
		invoker.onButtonClick();
		invoker.offButtonClick();
		invoker.undoButtonClick();
	}
}

 

 程序运行结果如下:

 

turn on the light!
turn on the TV!
turn on the radio!
turn off the light!
turn off the TV!
turn off the radio!
turn on the light!
turn on the TV!
turn on the radio!
 
Command模式即命令模式,是一种行为设计模式,它将请求封装为一个对象,使得请求的发送者和接收者之间解耦,还能支持撤销操作,并且可以被存储、记录、序列化、排队、日志等,为系统提供更大的灵活性[^1]。 命令模式的原理基于将请求封装成对象。其核心组件包括: - Command(命令):定义了执行请求的接口。 - ConcreteCommand(具体命令):实现了命令接口,负责调用请求的接收者来执行请求。 - Receiver(接收者):知道如何实施与执行一个请求相关的操作。 - Invoker(调用者):要求命令执行请求的对象。 - Client(客户端):创建具体命令对象并设置其接收者 [^2]。 命令模式的使用场景如下: - 需要将请求发送者和请求接收者解耦:命令模式允许请求发送者和接收者独立变化,互不影响。 - 需要支持命令的排队、记录请求日志、撤销操作等功能:命令模式可以轻松地扩展这些功能。 - 需要将一组操作组合在一起形成一个命令:命令模式可以将多个操作封装成一个命令对象 [^2]。 以下是一个简单的Java代码示例来展示命令模式: ```java // 命令接口 interface Command { void execute(); } // 接收者类 class LinuxSystem { public void cd() { System.out.println("执行cd命令"); } public void ls() { System.out.println("执行ls命令"); } } // 具体命令类:Cd命令 class CdCommand implements Command { private LinuxSystem receiver; public CdCommand(LinuxSystem receiver) { this.receiver = receiver; } @Override public void execute() { receiver.cd(); } } // 具体命令类:Ls命令 class LsCommand implements Command { private LinuxSystem receiver; public LsCommand(LinuxSystem receiver) { this.receiver = receiver; } @Override public void execute() { receiver.ls(); } } // 调用者类 class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } // 客户端类 public class Client { public static void main(String[] args) { // 创建接收者 LinuxSystem receiver = new LinuxSystem(); // 创建具体命令 Command cdCommand = new CdCommand(receiver); Command lsCommand = new LsCommand(receiver); // 创建调用者 Invoker invoker = new Invoker(); // 设置并执行命令 invoker.setCommand(cdCommand); invoker.executeCommand(); invoker.setCommand(lsCommand); invoker.executeCommand(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值