COMMAND
Command 模式非常简单,只有一个具有唯一方法的接口组成。
public interface ICommand {
public void execute();
}
1 一般的Command模式
CommandMaster中绑定要执行的Command,只要Command监测到一个事件,它只要调用相应的Command执行即可,它无需指导要做什么事情。
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter" />
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0" />
<v:f eqn="sum @0 1 0" />
<v:f eqn="sum 0 0 @1" />
<v:f eqn="prod @2 1 2" />
<v:f eqn="prod @3 21600 pixelWidth" />
<v:f eqn="prod @3 21600 pixelHeight" />
<v:f eqn="sum @0 0 1" />
<v:f eqn="prod @6 1 2" />
<v:f eqn="prod @7 21600 pixelWidth" />
<v:f eqn="sum @8 21600 0" />
<v:f eqn="prod @7 21600 pixelHeight" />
<v:f eqn="sum @10 21600 0" />
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
<o:lock v:ext="edit" aspectratio="t" />
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:387pt;
height:210pt'>
<v:imagedata xsrc="file:///C:\DOCUME~1\money\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg" mce_src="file:///C:\DOCUME~1\money\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg"
o:title="uml.command1" />
</v:shape><![endif]--><!--[if !vml]-->
public class CommandMaster {
Map<String, ICommand> map = new HashMap<String, ICommand>();
public void init() {
map.put("alarm", new AlarmCommand());
map.put("autobackup", new AutoBackupCommand());
}
public void execute(String key) {
ICommand c = map.get(key);
if (c != null) {
c.execute();
}
}
}
2 事务操作
接口ITransaction中,validate进行验证工作,execute是要执行的任务。在CreateEmsUserTransaction中,先用validate方法进行输入数据的有效性验证,验证其是否符合创建EMS User的条件,验证通过后,利用execute方法创建EMSUser.
优点:
1 把验证和执行的代码分离到CreateEmsUserTransaction类中,从实体上解除了该代码和获取数据的接口之间的耦合。
2 可以把通过验证的事务存在一起,在某个特定的时间统一执行,例如: 某数据库只有零点以后可以更新。
3 支持UNDO操作
public interface ICommand {
public void do(); //这个名字在java里面用不了
public void undo();
}
undo的代码几乎与do的代码一致,这样就可以很容易的实现某个操作的undo功能。
ACTIVE OBJECT
该模式使用Command模式来为系统提供一个简单的多任务核心。
public class ActiveObject {
private LinkedList<ICommand> commands = new LinkedList<ICommand>();
public void add(ICommand command) {
commands.add(command);
}
public void run() {
while (!commands.isEmpty()) {
ICommand cmd = commands.getFirst();
commands.removeFirst();
cmd.execute();
}
}
}
cmd.execute()中可以将其他的需要执行的ICommand放入commands中,这样run会一直执行下去。
当然也可以在ActiveObject加入多进程机制,是加入的Command自动执行。
COMPOSITE
在Command模式中,如果某个操作需要的不是一个Command,而是一组Command的执行结果,这时,就要维护一组Command的列表,需要更改CommandMaster的add()方法和run()方法,而且不利于后期的维护工作。这是可以使用Composite模式,使CommandMaster以对待一个Command的方式去对待一组Command.
<!--[if gte vml 1]><v:shape
id="_x0000_i1027" type="#_x0000_t75" style='width:321.75pt;height:209.25pt'>
<v:imagedata xsrc="file:///C:\DOCUME~1\money\LOCALS~1\Temp\msohtml1\01\clip_image004.png" mce_src="file:///C:\DOCUME~1\money\LOCALS~1\Temp\msohtml1\01\clip_image004.png"
o:title="" />
</v:shape><![endif]--><!--[if !vml]-->
<!--[endif]-->
public class CompositeCommand implements ICommand {
private List<ICommand> commands = new ArrayList<ICommand>();
public void execute() {
for (ICommand command : commands) {
command.execute();
}
}
public void add(ICommand command) {
commands.add(command);
}
}
对系统来说,CompositeCommand就像一个单一的Command,它表现的就像一个Command,只不过它是一组Command的代理。
使用Composite模式可以使系统一对多关系转化为一对一关系,可以更有利于理解和维护。但它并不能使得所有的一对多关系都转化为一对一,只有以一致的方式对待列表中的每一个对象的情况下才可以使用。
<!--[endif]-->