码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(一)——命令模式

时间:2017-09-16 17:25:11      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:ssi   变化   必须   main   组合   number   static   设计模式   png   

1.描述

将一个请求封装为一个对象,从而使用户可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。

2.用途

在程序设计中,经常涉及道一个对象请求另一个对象调用其方法的情况。如果请求者不希望或无法直接和请求者打交道,即不希望或无法包含被请求者的引用,就可以使用命令模式。

在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适,这是就是不希望请求者包含被请求者的引用以降低耦合度。

3.模式的使用

命令模式中有四种角色

·接受者(Receiver):接受者是一个类的示实例,该实例负责执行与请求相关的操作。

·命令(Command)接口:命令时一个接口,规定了用来封装“请求”的若干方法。

·具体命令(ConcreteCommand):具体命令是实现命令接口的类的实例。具体命令必须实现命令接口中的方法。

·请求者(Invoker):请求者是一个包含Conmmand接口变量的类的实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责调用具体命令,让具体命令执行那些封装了“请求”的方法。

4.UML图

技术分享

 

5.案例

要求:请求者请求只输出英文字母表,只输出俄文字母表,只输出1~N的偶数,或者任意组合以上请求的命令。

对于上述问题我们设计

两个接受者:

PrintLetter打印英文字母或俄文字母

PrintEvenNumber打印偶数

命令接口:

Command

三个具体命令以及一个宏命令:

PrintEnglishCommand(打印英文字母)

PrintRussianCommand(打印俄文字母)

PrintEvenNumberCommand(打印偶数)

 

MacroCommand(宏命令)

 

 代码:

  1 package 命令模式.test2;
  2 /**
  3  * 接受者,打印字母
  4  */
  5 public class PrintLetter {
  6     public void printEnglish(){
  7         for(char c = ‘a‘; c < ‘z‘; c++ )
  8             System.out.print(c + "\t");
  9     }
 10     
 11     public void printRussian(){
 12         for(char c = ‘а‘; c < ‘я‘; c++ )
 13             System.out.print(c + "\t");
 14     }
 15 }
 16 
 17 
 18 package 命令模式.test2;
 19 
 20 /**
 21  * 接受者,打印数字
 22  */
 23 public class PrintNumber {
 24     int n;
 25     PrintNumber(int n){
 26         this.n = n;
 27     }
 28     
 29     public void printEvenNmuber(){
 30         for(int i = 1; i <= n; i++)
 31             if(i % 2 ==0)
 32                 System.out.println(i + "\t");
 33     }
 34 }
 35 
 36 
 37 package 命令模式.test2;
 38 
 39 /**
 40  * 命令接口
 41  */
 42 public interface Command {
 43     public abstract void execute();
 44 }
 45 
 46 
 47 package 命令模式.test2;
 48 
 49 /**
 50  * 打印英文字母具体命令
 51  */
 52 public class PrintEnglishCommand implements Command {
 53     PrintLetter letter;
 54     PrintEnglishCommand(PrintLetter letter){
 55         this.letter = letter;
 56     }
 57     public void execute() {
 58         letter.printEnglish();
 59     }
 60 
 61 }
 62 
 63 
 64 package 命令模式.test2;
 65 
 66 /**
 67  * 打印俄文字母具体命令
 68  */
 69 public class PrintRussianCommand implements Command {
 70     PrintLetter letter;
 71     public PrintRussianCommand(PrintLetter letter) {
 72         this.letter = letter;
 73     }
 74 
 75     public void execute() {
 76         letter.printRussian();
 77     }
 78 
 79 }
 80 
 81 
 82 package 命令模式.test2;
 83 
 84 /**
 85  * 打印偶数具体命令
 86  */
 87 public class PrintEvenNumberCommand implements Command {
 88     PrintNumber letter;
 89     public PrintEvenNumberCommand(PrintNumber letter) {
 90         this.letter = letter;
 91     }
 92     public void execute() {
 93         letter.printEvenNmuber();
 94     }
 95 
 96 }
 97 
 98 
 99 package 命令模式.test2;
100 
101 import java.util.ArrayList;
102 
103 /**
104  * 宏命令,具体命令
105  */
106 public class MacroCommand implements Command {
107     ArrayList<Command> commandList;
108     public MacroCommand(ArrayList<Command> commandList) {
109         this.commandList = commandList;
110     }
111 
112     public void execute() {
113         for(int i = 0; i < commandList.size(); i++)
114             commandList.get(i).execute();
115     }
116 
117 }
118 
119 
120 package 命令模式.test2;
121 
122 /**
123  * 请求者
124  */
125 public class Request {
126     Command command;
127     public void setCommand(Command command){
128         this.command = command;
129     }
130     
131     public void execute(){
132         command.execute();
133     }
134 }
135 
136 
137 package 命令模式.test2;
138 
139 import java.util.ArrayList;
140 
141 public class test {
142 
143 
144     public static void main(String[] args) {
145         ArrayList<Command> commandList = new ArrayList<Command>();
146         Request request = new Request(); //创建请求者
147         Command c1 = new PrintEnglishCommand(new PrintLetter());
148         Command c2 = new PrintRussianCommand(new PrintLetter());
149         Command c3 = new PrintEvenNumberCommand(new PrintNumber(20));
150         commandList.add(c1);
151         commandList.add(c2);
152         commandList.add(c3);
153         Command MacroCommand = new MacroCommand(commandList);
154         request.setCommand(MacroCommand);
155         request.execute();
156     }
157 
158 }

 

设计模式(一)——命令模式

标签:ssi   变化   必须   main   组合   number   static   设计模式   png   

原文地址:http://www.cnblogs.com/cxy2016/p/7531627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!