命令模式
定义
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
优缺点
优点
- 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
- 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
- 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
- 方便实现 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
这里就不填代码了。其实也是差不多的。也带上类图吧