Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277142
  • 博文数量: 83
  • 博客积分: 2393
  • 博客等级: 大尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-24 15:14
文章分类

全部博文(83)

文章存档

2019年(21)

2011年(5)

2010年(2)

2009年(1)

2008年(9)

2007年(33)

2006年(12)

我的朋友

分类: Java

2019-08-26 18:07:49


https://www.cnblogs.com/betterboyz/p/9377991.html
在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:
  命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。
  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。



命令模式的结构
  命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
  每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
  命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:
  (1)命令模式使新的命令很容易地被加入到系统里。
  (2)允许接收请求的一方决定是否要否决请求。
  (3)能较容易地设计一个命令队列。
  (4)可以容易地实现对请求的撤销和恢复。
  (5)在需要的情况下,可以较容易地将命令记入日志。
  下面以一个示意性的系统,说明命令模式的结构。


命令模式涉及到五个角色,它们分别是:
  ●  客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
  ●  命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
  ●  具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
  ●  请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
  ●  接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。


源代码
  接收者角色类

点击(此处)折叠或打开

  1. public class Receiver {
  2.     /**
  3.      * 真正执行命令相应的操作
  4.      */
  5.     public void action(){
  6.         System.out.println("执行操作");
  7.     }
  8. }
抽象命令角色类

点击(此处)折叠或打开

  1. public interface Command {
  2.     /**
  3.      * 执行方法
  4.      */
  5.     void execute();
  6. }

具体命令角色类

点击(此处)折叠或打开

  1. public class ConcreteCommand implements Command {
  2.     //持有相应的接收者对象
  3.     private Receiver receiver = null;
  4.     /**
  5.      * 构造方法
  6.      */
  7.     public ConcreteCommand(Receiver receiver){
  8.         this.receiver = receiver;
  9.     }
  10.     @Override
  11.     public void execute() {
  12.         //通常会转调接收者对象的相应方法,让接收者来真正执行功能
  13.         receiver.action();
  14.     }

  15. }
请求者角色类

点击(此处)折叠或打开

  1. public class Invoker {
  2.     /**
  3.      * 持有命令对象
  4.      */
  5.     private Command command = null;
  6.     /**
  7.      * 构造方法
  8.      */
  9.     public Invoker(Command command){
  10.         this.command = command;
  11.     }
  12.     /**
  13.      * 行动方法
  14.      */
  15.     public void action(){
  16.         
  17.         command.execute();
  18.     }
  19. }
客户端角色类

点击(此处)折叠或打开

  1. public class Client {

  2.     public static void main(String[] args) {
  3.         //创建接收者
  4.         Receiver receiver = new Receiver();
  5.         //创建命令对象,设定它的接收者
  6.         Command command = new ConcreteCommand(receiver);
  7.         //创建请求者,把命令对象设置进去
  8.         Invoker invoker = new Invoker(command);
  9.         //执行方法
  10.         invoker.action();
  11.     }

  12. }

AudioPlayer系统
  小女孩茱丽(Julia)有一个盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能,录音机的键盘便是请求者(Invoker)角色;茱丽(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。茱丽(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。茱丽(Julia)只需要在键盘上按下相应的键便可以了。
  录音机是典型的命令模式。录音机按键把客户端与录音机的操作细节分割开来。



源代码
  接收者角色,由录音机类扮演

点击(此处)折叠或打开

  1. public class AudioPlayer {
  2.     
  3.     public void play(){
  4.         System.out.println("播放...");
  5.     }
  6.     
  7.     public void rewind(){
  8.         System.out.println("倒带...");
  9.     }
  10.     
  11.     public void stop(){
  12.         System.out.println("停止...");
  13.     }
  14. }

抽象命令角色类

点击(此处)折叠或打开

  1. public interface Command {
  2.     /**
  3.      * 执行方法
  4.      */
  5.     public void execute();
  6. }
具体命令角色类

点击(此处)折叠或打开

  1. public class PlayCommand implements Command {

  2.     private AudioPlayer myAudio;
  3.     
  4.     public PlayCommand(AudioPlayer audioPlayer){
  5.         myAudio = audioPlayer;
  6.     }
  7.     /**
  8.      * 执行方法
  9.      */
  10.     @Override
  11.     public void execute() {
  12.         myAudio.play();
  13.     }

  14. }


点击(此处)折叠或打开

  1. public class RewindCommand implements Command {

  2.     private AudioPlayer myAudio;
  3.     
  4.     public RewindCommand(AudioPlayer audioPlayer){
  5.         myAudio = audioPlayer;
  6.     }
  7.     @Override
  8.     public void execute() {
  9.         myAudio.rewind();
  10.     }

  11. }


点击(此处)折叠或打开

  1. public class StopCommand implements Command {
  2.     private AudioPlayer myAudio;
  3.     
  4.     public StopCommand(AudioPlayer audioPlayer){
  5.         myAudio = audioPlayer;
  6.     }
  7.     @Override
  8.     public void execute() {
  9.         myAudio.stop();
  10.     }

  11. }
请求者角色,由键盘类扮演

点击(此处)折叠或打开

  1. public class Keypad {
  2.     private Command playCommand;
  3.     private Command rewindCommand;
  4.     private Command stopCommand;
  5.     
  6.     public void setPlayCommand(Command playCommand) {
  7.         this.playCommand = playCommand;
  8.     }
  9.     public void setRewindCommand(Command rewindCommand) {
  10.         this.rewindCommand = rewindCommand;
  11.     }
  12.     public void setStopCommand(Command stopCommand) {
  13.         this.stopCommand = stopCommand;
  14.     }
  15.     /**
  16.      * 执行播放方法
  17.      */
  18.     public void play(){
  19.         playCommand.execute();
  20.     }
  21.     /**
  22.      * 执行倒带方法
  23.      */
  24.     public void rewind(){
  25.         rewindCommand.execute();
  26.     }
  27.     /**
  28.      * 执行播放方法
  29.      */
  30.     public void stop(){
  31.         stopCommand.execute();
  32.     }
  33. }

客户端角色,由茱丽小女孩扮演


点击(此处)折叠或打开

  1. public class Julia {
  2.     public static void main(String[]args){
  3.         //创建接收者对象
  4.         AudioPlayer audioPlayer = new AudioPlayer();
  5.         //创建命令对象
  6.         Command playCommand = new PlayCommand(audioPlayer);
  7.         Command rewindCommand = new RewindCommand(audioPlayer);
  8.         Command stopCommand = new StopCommand(audioPlayer);
  9.         //创建请求者对象
  10.         Keypad keypad = new Keypad();
  11.         keypad.setPlayCommand(playCommand);
  12.         keypad.setRewindCommand(rewindCommand);
  13.         keypad.setStopCommand(stopCommand);
  14.         //测试
  15.         keypad.play();
  16.         keypad.rewind();
  17.         keypad.stop();
  18.         keypad.play();
  19.         keypad.stop();
  20.     }
  21. }


阅读(815) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~