GoF设计模式之十四 Command- -

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:32:29
C2) Command(支配模式)
定义:把请求封装成一个对象,从而使你参数化有不同请求的客户端,队列或者记录这些请求,并且支持可取消的操作。
好难看懂的一个定义,并且模式本身也不容易理解,JAVA中SWING的组件中对Command模式的运用非常多,所以很多都是以SWING作为例子。可能是由于不太接触SWING的关系吧,一时不能很好的理解,看了一些代码后渐渐明白了这个模式的用意。面向接口是关键所在,用Command接口封装请求的处理者Receiver,客户端只需将请求作为参数传递给服务器端,服务器端通过Command接口的不同实现就可以处理不同的请求。这个模式的另外一个特点就是在Command接口中Undo功能,并通过服务器端记录每次的Command,就可以实现操作的取消。比如一个累计的操作,在Do(int i)中调用compute.plus(i),在Undo(int i)中调用compute.minus(i)或者compute.plus(-i),如此就可以实现取消/恢复功能。在了解了Command模式后,突然发现其实现在大多数的MVC框架都使用了这个模式,看看比较流行的struts的一段源代码,取自org.apache.struts.action.RequestProcessor
protected ActionForward
processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping) throws IOException, ServletException {
try {
return (action.execute(mapping, form, request, response));
} catch (Exception e) {
return (processException(request, response, e, form, mapping));
}
}
Action是一个接口,每一个实现它的对象都必须实现execute方法,在执行这个函数之前,已经通过Action action = processActionCreate(request, response, mapping);得到客户端所请求的action对象。客户端通过login.do形式发送给ActionServlet,就可以调用LoginAction对象,通过search.do的形式就能调用SearchAction对象,而ActionServlet不用知道客户端发送的是什么请求。
参考:
1、http://www.jdon.com/designpatterns/command.htm(中文、java实例)
2、http://www.dofactory.com/Patterns/PatternCommand.aspx(英文、C#实例、UML)
3、http://www.caterpillar.onlyfun.net/PmWiki/pmwiki.php/DesignPattern/CommandPattern(中文、java实例、UML)推荐