设计模式java——命令模式

本文通过一个实战案例介绍了命令模式的基本概念及应用。展示了如何通过命令模式实现请求的封装、参数化、队列化以及日志记录等功能,并支持撤销操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式Demo:

/**
 * 2018年4月6日下午11:15:26
 */
package com.Designpattern;

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

/**
 * @author xinwenfeng
 *
 */
public class TestCommand {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Receiver r = new Receiver();
		MyCommand mc1 = new Command1(r);
		MyCommand mc2 = new Command2(r);
		CommandInvoker invoker1 = new CommandInvoker();
		invoker1.setCommand(mc1);
		invoker1.excuteCommand();
		invoker1.setCommand(mc2);
		invoker1.excuteCommand();
		System.out.println("=====================");
		CommandInvoker2 invoker2 = new CommandInvoker2();
		invoker2.addCommand(mc1);
		invoker2.addCommand(mc2);
		invoker2.excuteCommand();
		System.out.println("remove mc1");
		invoker2.removeCommand(mc1);
		invoker2.excuteCommand();
	}

}
class Receiver{
	public void runCommand(String s) {
		System.out.println("执行命令:"+s);
	}
}
abstract class MyCommand{
	protected Receiver receiver;
	public MyCommand(Receiver r) {
		this.receiver = r;
	}
	abstract void excute();
}
class Command1 extends MyCommand{
	
	public Command1(Receiver r) {
		super(r);
	}
	
	@Override
	void excute() {
		receiver.runCommand("ls -hl");
	}
	
}
class Command2 extends MyCommand{
	
	public Command2(Receiver r) {
		super(r);
	}
	
	@Override
	void excute() {
		receiver.runCommand("nohup java -jar HelloWorld.jar &");
	}
	
}
class CommandInvoker{
	private MyCommand command;

	public void setCommand(MyCommand command) {
		this.command = command;
	}
	
	public void excuteCommand() {
		command.excute();
	}

}
class CommandInvoker2{
	private List<MyCommand> commandList = new ArrayList<>();//命令列表

	public void addCommand(MyCommand command) {//添加命令
		commandList.add(command);
	}
	
	public void removeCommand(MyCommand command) {//撤销命令
		commandList.remove(command);
	}
	
	public void excuteCommand() {
		for(MyCommand c:commandList) {//统一执行多条命令
			c.excute();
		}
	}

}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值