设计模式--命令模式

命令模式

 

概述:

  有三个对象:接收者,调用者,命令

  场合:调用者需要让接收者执行其方法,将接收者和调用者解耦

 

以下是个人的分析与理解:

  调用者需要让接受者做某事,我们完全可以这样做:调用者中包含接受者的引用,并调用其方法。但是这样通过硬编码的实现方式,使得调用者与接受者之间是强耦合的。一个解决此问题的方法便是:命令模式。

  建立命令模式的步骤:

    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.

 

 

posted @ 2013-04-16 22:36  Alex_Monkey  阅读(788)  评论(0编辑  收藏  举报