设计模式--行为型模式--命令模式

=========================
命令模式:
=========================

废话不说了,先看例子:

模拟对电视机的操作有开机、关机、换台命令。代码如下

Command角色--定义命令的接口,声明执行的方法。

1 //执行命令的接口
2 public interface Command {
3   void execute();
4 } 

Receive角色--命令接收者,真正执行命令的对象。实现命令要求实现的相应功能。

 1     //命令接收者Receiver
 2     public class Tv {
 3       public int currentChannel = 0;
 4
 5       public void turnOn() {
 6          System.out.println("The televisino is on.");
 7       }
 8
 9       public void turnOff() {
10          System.out.println("The television is off.");
11       }
12
13       public void changeChannel(int channel) {
14          this.currentChannel = channel;
15          System.out.println("Now TV channel is " + channel);
16       }
17     }  

ConcreteCommand角色--通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。一般一个命令对应一个对象,分别是CommandOn,CommandOff,CommandChange

commandon对象:

 1     //开机命令ConcreteCommand
 2     public class CommandOn implements Command {
 3       private Tv myTv;
 4
 5       public CommandOn(Tv tv) {
 6          myTv = tv;
 7       }
 8
 9       public void execute() {
10          myTv.turnOn();
11       }
12     }  

commandoff对象:

 1     //关机命令ConcreteCommand
 2     public class CommandOff implements Command {
 3       private Tv myTv;
 4
 5       public CommandOff(Tv tv) {
 6          myTv = tv;
 7       }
 8
 9       public void execute() {
10          myTv.turnOff();
11       }
12     }  

commandchange对象:

 1     //频道切换命令ConcreteCommand
 2     public class CommandChange implements Command {
 3       private Tv myTv;
 4
 5       private int channel;
 6
 7       public CommandChange(Tv tv, int channel) {
 8          myTv = tv;
 9          this.channel = channel;
10       }
11
12       public void execute() {
13          myTv.changeChannel(channel);
14       }
15     }  

Invoker角色--持有很多的命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

 1     //可以看作是遥控器Invoker
 2     public class Control {
 3       private Command onCommand, offCommand, changeChannel;
 4
 5       public Control(Command on, Command off, Command channel) {
 6          onCommand = on;
 7          offCommand = off;
 8          changeChannel = channel;
 9       }
10
11       public void turnOn() {
12          onCommand.execute();
13       }
14
15       public void turnOff() {
16          offCommand.execute();
17       }
18
19       public void changeChannel() {
20          changeChannel.execute();
21       }
22     }  

Client角色--组装命令对象和接收者创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者

 1     //测试类Client
 2     public class Client {
 3       public static void main(String[] args) {
 4          // 命令接收者Receiver
 5          Tv myTv = new Tv();
 6          // 开机命令ConcreteCommond
 7          CommandOn on = new CommandOn(myTv);
 8          // 关机命令ConcreteCommond
 9          CommandOff off = new CommandOff(myTv);
10          // 频道切换命令ConcreteCommond
11          CommandChange channel = new CommandChange(myTv, 2);
12          // 命令控制对象Invoker
13          Control control = new Control(on, off, channel);
14
15          // 开机
16          control.turnOn();
17          // 切换频道
18          control.changeChannel();
19          // 关机
20          control.turnOff();
21       }
22     }  

执行结果

1     The televisino is on.
2     Now TV channel is 2
3     The television is off.  

看完代码,是不是对命令模式有个大概的了解了。

1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。

2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。

3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

4.命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。

5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

下面看下类图:

角色分析:

Command: 抽象命令类。用来声明执行操作的接口。

ConcreteCommand: 具体命令类。将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Excute。

Invoker: 调用者。要求该命令执行这个请求。

Receiver: 接收者。知道如何实施与执行一个请求相关的操作,任何类都有可能成为一个接收者。

Client:客户类。

优点

1.降低对象之间的耦合度。

2.新的命令可以很容易地加入到系统中。

3.可以比较容易地设计一个组合命令。

4.调用同一方法实现不同的功能

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

适用情况

1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

2.系统需要在不同的时间指定请求、将请求排队和执行请求。

3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

4.系统需要将一组操作组合在一起,即支持宏命令。

文章来源:

http://blog.csdn.net/jason0539/article/details/45110355

http://www.cnblogs.com/chenssy/p/3357683.html

时间: 2024-10-04 23:49:49

设计模式--行为型模式--命令模式的相关文章

设计模式(行为型)之命令模式(Command Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之策略模式(Strategy Pattern)>http://blog.csdn.net/yanbober/article/details/45498567 概述 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构

java设计模式--行为型模式--命令模式

1 命令模式 2 概述 3 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 4 5 6 适用性 7 1.抽象出待执行的动作以参数化某对象. 8 9 2.在不同的时刻指定.排列和执行请求. 10 11 3.支持取消操作. 12 13 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 14 15 5.用构建在原语操作上的高层操作构造一个系统. 16 17 18 参与者 19 1.Command 20 声明执行操作的接口.

行为型模型 命令模式

行为型模型 命令模式 Command         Command命令的抽象类. ConcreteCommand         Command的具体实现类. Receiver         需要被调用的目标对象. Invorker         通过Invorker执行Command对象. 适用于:         是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. /** * 行为型模型 命令模式 * Command模

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

设计模式(行为型)之策略模式(Strategy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之迭代器模式(Iterator Pattern)>http://blog.csdn.net/yanbober/article/details/45497881 概述 使用策略模式可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险. public class ChainTest { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; Stri

设计模式(行为型)之迭代器模式(Iterator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之观察者模式(Observer Pattern)>http://blog.csdn.net/yanbober/article/details/45484749 概述 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构

设计模式(行为型)之备忘录模式(Memento Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之中介者模式(Mediator Pattern)>http://blog.csdn.net/yanbober/article/details/45533335 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无

设计模式(行为型)之解释器模式(Interpreter Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之访问者模式(Visitor Pattern)>http://blog.csdn.net/yanbober/article/details/45536787 概述 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个