首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Design Pattern: Command 方式

2012-11-04 
Design Pattern: Command 模式如果您写过Java的Swing视窗程式,您可能使用过Command模式了,例如在您按下JMe

Design Pattern: Command 模式

如果您写过Java的Swing视窗程式,您可能使用过Command模式了,例如在您按下JMenuItem的“剪下”选项时,执行对JTextArea的选定文字之剪下动作,并将状态列设定为文件已修改状态。

在设计Swing时,设计人员是不可能知道使用Swing类别的人,在某个事件发生后所要执行的动作是什么的,他们采用了Command模式,以上面的需求作为例子,一个实作的片段可能像是这个样子:

menuCut.addActionListener(
??? new ActionListener() {
??????? public void actionPerformed(ActionEvent e) {
??????????? // textArea 是 JTextArea的一个实例
??????????? textArea.cut();??
???????? }
??? });

?
上面个这片段采用的是Java的匿名类别(Anonymous class),一个不具名的类别实作了ActionListener介面,它只有一个方法actionPerformed(),使用 addActionListener()为JMenuItem加入这个类别的实例,一但这个JMenuItem被按下,它就会调用 actionPerformed()方法,以执行您所定义的工作, UML 类别图如下所示:

使用Command模式,您可以根据实际的需求来调用执行的物件,至于执行的细节封装在事先定义好的方法(例如actionPerformed()方法,下面实际撰写个程式作为示范:
Invoker.java
import java.util.*;public class Invoker {    private Map commands;        public Invoker() {        commands = new HashMap();    }        public void addCommand(String commName,                           ICommand command) {        commands.put(commName, command);    }        public void request(String commName) {        ICommand command = (ICommand) commands.get(commName);        command.execute();    }} 

?

ICommand.java
public interface ICommand {    public void execute();} 

?

UpperCaseHello.java
public class UpperCaseHello implements ICommand {    private String name;        public UpperCaseHello(String name) {        this.name = name;        }        public void execute() {        System.out.println("HELLO, " + name.toUpperCase());    }} 

?

LowerCaseHello.java
public class LowerCaseHello implements ICommand {    private String name;        public LowerCaseHello(String name) {        this.name = name;        }        public void execute() {        System.out.println("hello, " + name.toLowerCase());    }} 


Client模拟随机的请求,Invoker事先并不知道Client会发出什么需求,但它总是可以执行Client的请求:

Client.java
public class Client {    public static void main(String[] args) {        Invoker invoker = new Invoker();        invoker.addCommand("JUSTIN",                             new UpperCaseHello("Justin"));        invoker.addCommand("momor",                             new LowerCaseHello("momor"));                // simulate random request        String[] req = {"JUSTIN", "momor"};        while(true) {            int i = (int) (Math.random() * 10) % 2;            invoker.request(req[i]);        }    }} 

?

像上面这种将请求封装起来的模式,就是Command模式

热点排行