[设计模式]Netd中的命令设计模式
命令模式
有如下的角色:
(1)调用者(invoker)
(2)命令接收者(receiver)
(3)客户端(client)
(4)命令对象(command)
1 public interface Command { 2 public void execute(); 3 } 4 public class ConcreteCommand implements Command { 5 6 private Receiver receiver = null; 7 private String state; 8 9 public ConcreteCommand(Receiver receiver){ 10 this.receiver = receiver; 11 } 12 public void execute() { 13 receiver.action(); 14 } 15 } 16 17 18 public class Receiver { 19 public void action(){ 20 //真正执行命令操作的功能代码 21 } 22 } 23 24 public class Invoker { 25 private Command command = null; 26 27 public void setCommand(Command command) { 28 this.command = command; 29 } 30 31 public void runCommand() { 32 command.execute(); 33 } 34 } 35 36 public class Client { 37 public void assemble(){ 38 //创建接收者 39 Receiver receiver = new Receiver(); 40 //创建命令对象,设定它的接收者 41 Command command = new ConcreteCommand(receiver); 42 //创建Invoker,把命令对象设置进去 43 Invoker invoker = new Invoker(); 44 invoker.setCommand(command); 45 } 46 }
在Netd的命令模式中Client角色和invoker角色都为CommandListener
receiver为CommandListener中各种各种Controller,其中有
FirewallController *CommandListener::sFirewallCtrl = NULL;
与上面的命令模式不同,各种Command为CommandListener的内部类,可直接使用receiver,而不用将receiver传递给Command对象。还有一点不同的就是,这里的各种controller作为receiver没有像例子中有统一的action函数,而是直接在runCommand函数(例子中是Command类的execute函数)使用controller实现各种动作的执行。
Netd的各种命令分发路径如下:
SocketListener::runListener
->FameworkListener::onDataAvailable
-> FameworkListener::dispatchCommand
-> CommandListener::各种Cmd::runCommand
(版权所有,转载请告知)