设计模式--命令模式
命令模式
概述:
有三个对象:接收者,调用者,命令
场合:调用者需要让接收者执行其方法,将接收者和调用者解耦
以下是个人的分析与理解:
调用者需要让接受者做某事,我们完全可以这样做:调用者中包含接受者的引用,并调用其方法。但是这样通过硬编码的实现方式,使得调用者与接受者之间是强耦合的。一个解决此问题的方法便是:命令模式。
建立命令模式的步骤:
1. 建立一个命令Command接口,包含一个execute()方法。
2. 建立一个CommandImpl类,实现Command接口;包含一个Accepter接受者,覆写execute方法时,调用Accpter具体方法。
3. 建立一个Invoker调用类,包含一个setCommand()方法,通过此方法将Command注入;并封装Command的execute()方法。
显然,调用链为:Invoker的方法 -> 调用Command的execute() -> 调用Accpter的方法。
这样,Command就如一个中间桥梁一样,使得Invoker和Acceper之间解耦:Invoker无需关注Accepter有哪些方法,它只需调用Command的execute()方法,就可达到调用Accepter的方法。
实现:
Accepter:
1 public class Accepter { 2 3 public void doSomething() { 4 System.out.println("im accepter, i do something."); 5 } 6 7 }
Command接口:
1 public interface Command { 2 public void execute(); 3 }
CommandImpl:
1 public class CommandImpl implements Command { 2 3 private Accepter accepter; 4 5 public CommandImpl(Accepter accepter) { 6 this.accepter = accepter; 7 } 8 9 public void setAccepter(Accepter accepter) { 10 this.accepter = accepter; 11 } 12 13 @Override 14 public void execute() { 15 // TODO Auto-generated method stub 16 accepter.doSomething(); 17 } 18 19 }
Invoker:
1 public class Invoker { 2 3 private Command command; 4 5 public Invoker() {} 6 7 public Invoker(Command command) { 8 this.command = command; 9 } 10 11 public void setCommand(Command command) { 12 this.command = command; 13 } 14 15 public void doSomething() { 16 command.execute(); 17 } 18 }
Client:
1 public class Client { 2 3 public static void main(String[] args) { 4 Accepter accepter = new Accepter(); 5 Command command = new CommandImpl(accepter); 6 Invoker invoker = new Invoker(); 7 8 invoker.setCommand(command); 9 invoker.doSomething(); 10 } 11 12 }
运行结果:
1 im accepter, i do something.