Tuesday, January 13, 2009

Command模式和Adapter模式的区别

更多精彩请到 http://www.139ya.com

Command模式和Adapter模式的区别

转自:http://www.javaeye.com/topic/18648?page=1


A:-------------------------------------------------

以Webwork为例(因为Webwork使用了Command模式),

/**
* 这是Webwork里面的Action接口,它充当了抽象Command的角色。
*/
public interface Action
{
public String execute();;
}

/**
* 该类实现了抽象Command,扮演一个具体的Command角色
*/
public class LoginAction implements Action{

// 该类是不是可以理解为一个Receiver的角色?
private AccountManager accountManager

public LoginAction(AccountManager accountManager);
{
this.accountManager = accountManager;
}

public String execute(); {
accountManager.login();;
return "login";
}

}


我的理解是:Webwork中的ServletDispather充当了Invoker的角色。在一个典型的Web应用程序中,有各种请求需要处理,例如登录、查看、删除、增加、修改等等。因此根据需求的不同,会出现AccountManger,ProductManager(Receiver)等等相应的类来处理各种不同请求。然而ServletDispather并不知道该如何调用这些Receiver的方法,因此需要通过一个 Action(Command)接受不同的Receiver,由Action负责调用Receiver的方法。而SerlvetDispather只需调用Action.execute()就可以了。不知道以上理解是否正确?


同时我又觉得这非常象Adapter模式。因为可以认为ServletDispather只能处理Action(Adapter模式中的 Target角色)类型的接口,而我们的业务逻辑层存在大量诸如AccoutManager、ProduntManager的类(Adapter模式中的 Adaptee角色),因此为了让ServletDispather来使用业务逻辑层的类,因此我们编写了诸如LoginAction、 ProductAction(Adapter模式中的Adapter角色)来使用业务逻辑层的对象。因此我怎么觉得Command模式非常象 Adapter模式?


B:-------------------------------------------------

以WW的开发人员看来,他们设计框架,Action是他们的Command。从你看来你的Action像是Adaptor。为了将你的Manager适配到ww的制定接口上。


这些本身就不怎么分的清,不过有一点倒是可以作为参考

command是为了让框架结构处理未知的过程,有点回掉的味道。
Adaptor是为了让已经存在的对象转换为另一套接口上

No comments: