稳固而知新 Command,Active Object,Composite

来源:互联网 发布:js隐藏jsp页面内容 编辑:程序博客网 时间:2024/05/20 18:02

COMMAND

Command 模式非常简单,只有一个具有唯一方法的接口组成。

public interface ICommand {

       public void execute();

}

1 一般的Command模式

       CommandMaster中绑定要执行的Command,只要Command监测到一个事件,它只要调用相应的Command执行即可,它无需指导要做什么事情。

public class CommandMaster {

       Map map = new HashMap();

       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 commands = new LinkedList();

       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.


public class CompositeCommand implements ICommand {

       private List commands = new ArrayList();

       public void execute() {

              for (ICommand command : commands) {

                     command.execute();

              }

       }

       public void add(ICommand command) {

              commands.add(command);

       }

}

对系统来说,CompositeCommand就像一个单一的Command,它表现的就像一个Command,只不过它是一组Command的代理。

使用Composite模式可以使系统一对多关系转化为一对一关系,可以更有利于理解和维护。但它并不能使得所有的一对多关系都转化为一对一,只有以一致的方式对待列表中的每一个对象的情况下才可以使用。