public void setCommands(List commands){ this.commands = commands; }
public void addCommand (Command command,int i){ commands.add(i,command); } public void removeCommand (int i){ commands.add(i,command); } //得代执行命令 public void action(){ for(Iterator it = list.iterator();it.hasNext();){ Command command = Command) it.next(); Command. execute(); } } …………… //还可以有丰富的redo和undo操作;(当然一些都给基于命令类提供的相应方法) }
//抽象命令 abstract class Command { abstract public void execute(); abstract public void unexecute(); abstract public void reexecute(); //一般有这样这个方法,根据需要可以增删 }
// 具体的命令类1:写作命令,选择一个作者(Author类实例对象),让他写作(调用它的write方法)写作的对象是书(Book的实例对象)形成了一个写作的命令,写作的对象是Book的实例 public class WriteCommand implement Command { Author author; //执行者 Book book; //要执行的对象 public WriteCommand (Author author,Book book) { this. author = author; this. book = book; } // 在这里执行要执行的操作 public override void Execute() { author.write (book); } }
// 具体的命令类2: 出版命令,选择一个出版社(publisher类实例对象),让他出版书(调用它的publisherBook方法)出版的对象是书(Book的实例对象)形成了一个出版的命令 public class PublishCommand implement Command { Publisher publisher; Book book; public PublishCommand (Publisher publisher) { this. publisher = publisher; this. book = book; } // Methods public override void Execute() { publisher. publisherBook(book); } }
// Publisher和Author类为执行者 略
这样我们的客户端代码就可以这样写: //如果我要出一本书 //一本空白的书 Book book = new Book(); //先找一个作者和出版社 Author author = new Author(); Publisher publisher = new Publisher (); //产生命令集合 Command writeCommand = new WriteCommand (author,book); Command publishCommand = new PublishCommand(publisher,book); List commands = new List (); Commands.add(writeCommand); //找个调用者,把命令给它,让他来根据命令协调工作 Invoker invoker = new invoker(); Invoker.setCommands(commands); public void addCommand (Command command,int i){ commands.add(i,command); } invoker.action();
2》形如流水线操作:还是出书的例子 //先是一本空白的书: Book book = new Book(); //找几个作者 Author author1 = new Author(); Author author2 = new Author(); //把写1,2章的名类分别给这两个作者 Command writeCommand = new Write1Command (author1,book); Command writeCommand = new Write2Command (author2,book); List commands = new List (); Commands.add(writeCommand); //调用者 Invoker invoker = new invoker(); Invoker.setCommands(commands); //流水写书 invoker.action() 实际上在aciton这一方法中,invoker按照命令,让两个作者流水写作这本书。(类似一个书的流水线加工工厂) 这样我们的书就被流水加工成功(当然这本书只有两章)
这样就给了我们一种系统设计的框架, 模型+工具+命令 客户端产生命令,命令调用工具操作模型。 Book 相当于模型 Author 相当于和多工具类中的一个 Command 命令