我的java设计模式 总结【13】命令模式Command

命令模式

定义

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

优缺点

优点

  • 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
  • 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
  • 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  • 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

缺点

  • 可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。

一个样例

双向链表实现的一个command

public class UseCommand {
	public static void main(String[] args) {
		commands c = new commands("hello",new addS());
		c.addCommand(new addAA());
		c.addCommand(new addFK());
		System.out.println(">> "+c.executes());	;
		System.out.println(">> "+c.unexecutes());		;
	}
}
class commands {
	String s;
	ICommand first;
	ICommand tail;
	commands(String s, ICommand c) {
		this.s = s;
		first = c;
		tail = c;
	}
	public void addCommand(ICommand c) {
		tail.setSCommand(c);
		c.setFCommand(tail);
		tail = c;
	}

	public String executes() {
		return s= first.execute(s);
	}

	public String unexecutes() {
		return s=tail.unexecute(s);	
	}
}

abstract class ICommand {
	ICommand f;
	ICommand s;
	abstract String execute(String str);
	abstract String unexecute(String str);
	ICommand getFCommand() {
		return f;
	}
	void setFCommand(ICommand f) {
		this.f = f;
	}
	ICommand getSCommand() {
		return s;
	}
	void setSCommand(ICommand s) {
		this.s = s;
	}
}

class addS extends ICommand {
	@Override
	public String execute(String ss) {
		String result = "S" + ss;
		if (s != null)
			return s.execute(result);
		return result;
	}
	@Override
	public String unexecute(String s) {
		if (f != null)
			s = f.unexecute(s);
		return s.substring(1);
	}
}

class addAA extends ICommand {
	@Override
	public String execute(String ss) {
		String result = "AA" + ss;
		if (s != null)
			return s.execute(result);
		return result;
	}
	@Override
	public String unexecute(String s) {
		if (f != null)
			s = f.unexecute(s);
		return s.substring(2);
	}
}
class addFK extends ICommand {
	@Override
	public String execute(String ss) {
		String result = "F**K" + ss;
		if (s != null)
			return s.execute(result);
		return result;
	}
	@Override
	public String unexecute(String s) {
		if (f != null)
			s = f.unexecute(s);
		return s.substring(4);
	}
}

这个略微复杂点。附上类图
在这里插入图片描述

对于用数组实现的commands
这里就不填代码了。其实也是差不多的。也带上类图吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值