`
ihuashao
  • 浏览: 4721782 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

稳固而知新 Command,Active Object,Composite

阅读更多

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的列表,需要更改CommandMasteradd()方法和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]-->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics