`
jokermanager
  • 浏览: 143822 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java中的模式 --- 命令模式

阅读更多

一,命令模式的实现:
命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者,
下边是简单命令模式的实现代码实现:
 1  public class Client{
 2      public static void main(String[] args){
 3         Receiver receiver = new Receiver();
 4         Command commandOne = new ConcreteCommandOne(receiver);
 5         Command commandTwo = new ConcreteCommandTwo(receiver);
 6         Invoker invoker = new Invoker(commandOne,commandTwo);
 7         invoker.actionOne();
 8         invoker.actionTwo();
 9     }
10 }
11  public class Invoker{
12     private Command commandOne;
13     private Command commandTwo;
14      public Invoker(Command commandOne,Command commandTwo){
15         this.commandOne = commandOne;
16         this.commandTwo = commandTwo;
17     }
18      public void actionOne(){
19         commandOne.execute();
20     }
21      public void actionTwo(){
22         commandTwo.execute();
23     }
24 }
25  public interface Command{
26     void execute();
27 }
28  public class ConcreteCommandOne implements Command{
29     private Receiver receiver
30      public ConcreteCommandOne(Receiver receiver){
31         this.receiver = receiver;
32     }
33      public void execute(){
34         receiver.actionOne();
35     }
36 }
37  public class ConcreteCommandTwo implements Command{
38     private Receiver receiver
39      public ConcreteCommandTwo(Receiver receiver){
40         this.receiver = receiver;
41     }
42      public void execute(){
43         receiver.actionTwo();
44     }
45 }
46  public class Receiver{
47      public Receiver(){
48         //
49     }
50      public void actionOne(){
51         System.out.println("ActionOne has been taken.");
52     }
53      public void actionTwo(){
54         System.out.println("ActionTwo has been taken.");
55     }
56 }

二,命令模式的功能,好处,或者说为什么使用命令模式?
上边的代码是否看起来很傻呢,本来可以这样简单实现的:
 1  public class Client{
 2      public static void main(String[] args){
 3         Receiver receiver = new Receiver();
 4         receiver.actionOne();
 5         receiver.actionTwo();
 6     }
 7 }
 8  public class Receiver{
 9      public Receiver(){
10         //
11     }
12      public void actionOne(){
13         System.out.println("ActionOne has been taken.");
14     }
15      public void actionTwo(){
16         System.out.println("ActionTwo has been taken.");
17     }
18 }

看多简洁,如果是像上边如此简单的需求,这个才应该是我们的选择,但是有些情况下这样的写法不能解决的,
或者说解决起来不好,所以引入命令模式.
(1)我们须要Client和Receiver同时开发,而且在开发过程中分别须要不停重购,改名
(2)如果我们要求Redo ,Undo等功能
(3)我们须要命令不按照调用执行,而是按照执行时的情况排序,执行
(4)开发后期,我们发现必须要log哪些方法执行了,如何在尽量少更改代码的情况下实现.并且渐少重复代码
(5)在上边的情况下,我们的接受者有很多,不止一个
解决办法:
情况一,我们可以定义一个接口,让Receiver实现这个接口,Client按照接口调用。
情况二,我们可以让Receiver记住一些状态,例如执行前的自己的状态,用来undo,但自己记录自己的状态
 实现起来比较混乱,一般都是一个累记录另一个类的状态.
情况三,很难实现
情况四,,我们须要在每个Action,前后加上log
情况五,相对好实现,但是再加上这个,是否感觉最终的实现很混乱呢
好,我们再来看看命令模式,在命令模式中,我们增加一些过渡的类,这些类就是上边的命名接口和命令实现,
这样就很好的解决了情况一,情况二。我们再加入一个Invoker,这样情况三和情况四就比较好解决了。
如下加入Log和排序后的Invoker
 1  public class Invoker{
 2     private List cmdList = new ArrayList();
 3      public Invoker(){
 4     }
 5      public add(Command command){
 6         cmdList.add(command);
 7     }
 8      public remove(Command command){
 9         cmdList.remove(command);
10     }
11      public void action(){
12         Command cmd;
13          while((cmd =getCmd()) != null){
14             log("begin"+cmd.getName());
15             cmd.execute();
16             log("end"+cmd.getName());       
17         }
18     }
19      public Command getCmd(){
20         //按照自定义优先级,排序取出cmd
21     }
22 }
23  public class Client{
24      public static void main(String[] args){
25         Receiver receiver = new Receiver();
26         Command commandOne = new ConcreteCommandOne(receiver);
27         Command commandTwo = new ConcreteCommandTwo(receiver);
28         Invoker invoker = new Invoker();
29         invoker.add(commandOne);
30         invoker.add(commandTwo);
31         iinvoker.action();
32     }
33 }

三,命令模式与其它模式的配合使用:
1,看上边的Invoker的实现是否很像代理模式呢,Invoker的这种实现其实就是一种代理模式。
2,需求:有个固定命令组合会多次被执行
   解决:加入合成模式,实现方法如下,定义一个宏命令类:
 1  public class MacroCommand implements Command{
 2     private List cmdList = new ArrayList();
 3      public add(Command command){
 4         cmdList.add(command);
 5     }
 6      public remove(Command command){
 7         cmdList.remove(command);
 8     }
 9      public void execute(){
10         Command cmd;
11          for(int i=0;i<cmdList.size();i++){
12             cmd = (Command)cmdList.get(i);
13             cmd.execute();
14         }
15     }   
16 }

3,需求:须要redo undo
  解决:加入备忘录模式,一个简单的实现如下
 1  public class ConcreteCommandOne implements Command{
 2     private Receiver receiver
 3     private Receiver lastReceiver;
 4      public ConcreteCommandOne(Receiver receiver){
 5         this.receiver = receiver;
 6     }
 7      public void execute(){
 8         record();
 9         receiver.actionOne();
10     }
11      public void undo(){
12         //恢复状态
13     }
14      public void redo(){
15         lastReceiver.actionOne();
16         //
17     }
18      public record(){
19         //记录状态
20     }
21 }

4,需求:命令很多类似的地方
   解决:使用原型模式,利用clone
   这个就不写例子了。
四,命令模式的使用场合
1,须要callback的时候,例如java awt/swing/swt中的Listening的消息方式
2,须要对请求排队执行,命令的发送者和接受者有不同对的生命周期,就是命令执行的时候,可能发出命令的
Client已经不存在了
3,须要Redo Undo等函数
4,须要log每条命令
5,须要支持transaction,封装一组数据命令的时候.
五,最后再次总结一下命令模式的优点和缺点:
优点:
降低Client和命令接受者的耦合,是命令请求和命令执行的对象分割
便于修改和扩张
便于聚合多个命令
缺点:
造成出现过多的具体命令类,太多文件。

五,一个比较有意思的例子,来说明命令模式
Client        :看电视的人
Invoker     :遥控器
Command :电信号
具体命令 :遥控器上的按键对应的不同的电信号
Receiver    :电视机
最后说一句,并不是全部按照模式写一定就好,应该根据你的需求来应用,或者全部应用,或者部分应用,或者根本不用。

分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式...命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式(Iterator Pattern)、组合模式(Composite Pattern)、观察者...

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

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

    java与模式-阎宏

    4. 行为型模式:包括职责链模式、命令模式、解释器模式、迭代器模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。行为型模式关注于对象之间的交互和行为,帮助我们更好地管理复杂的...

    Java与模式---闫宏

    《Java与模式---闫宏》这本书是针对Java程序员深入理解设计模式的重要参考资料。设计模式是软件工程中的一个重要概念,它们代表了在特定上下文中解决常见问题的最佳实践。这本书结合了中国的道家思想,以一种独特的...

    java设计模式-命令模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向...设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    设计模式--命令模式java例子

    在Java编程中,命令模式的应用广泛且实用。 命令模式的核心是将请求者(Invoker)与执行者(Receiver)解耦,通过引入命令(Command)接口和具体命令(Concrete Command)类来实现。在该模式中,有四个主要角色: ...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

    【Java 设计模式-源码】命令模式:增强灵活的命令执行

    在 Java 中,命令模式是一种行为设计模式,它将请求封装为对象,允许对客户端进行参数化,包括队列、请求和操作。该模式还支持可撤销的操作,增强了管理和执行命令的灵活性。 二、命令设计模式的别名 Action(动作)...

    java与模式-清晰书签版

    《Java与模式-清晰书签版》是一份包含多种Java设计模式详解的资源包,旨在帮助开发者深入理解和应用设计模式。这份资源集成了多种格式的文档,包括详细的文本描述、图表解析以及实际代码示例,使得学习过程更加直观...

    mongo-java-driver-3.2.2

    8. **事件监听**:通过实现特定接口,开发者可以监听驱动程序中的各种事件,如连接创建、命令执行等,以便进行日志记录、监控或其他自定义处理。 9. **性能优化**:此版本可能包含对查询性能的优化,如更快的查询...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    13. **命令模式(Command Pattern)**:将请求封装为一个对象,使得可以使用不同的请求、队列请求、记录请求或者支持可撤销的操作。 14. **责任链模式(Chain of Responsibility Pattern)**:避免对象之间的耦合,...

    java常用设计模式-命令模式

    在 Java 中,命令模式的实现通常涉及一个命令接口和一个或多个具体命令类,这些类实现了命令接口,并在其 execute() 方法中定义了实际的命令逻辑。 命令模式的组成部分: 1. 命令接口(Command):定义了 execute...

    设计模式-Java语言中的应用

    通过阅读《设计模式-Java语言中的应用》,读者不仅可以掌握设计模式的基本概念和原理,还能学习到如何在实际项目中选择合适的设计模式,以及如何优雅地在Java代码中实现这些模式。这将有助于提升开发者的编程技巧,...

    Java设计模式-图解-附代码.doc

    本文件“Java设计模式-图解-附代码.doc”主要探讨了Java语言中的设计模式,分为创建型、结构型和行为型三大类。下面将对这些模式进行详细解释。 1. **创建型模式**: - **工厂方法**:提供一个接口用于创建对象,...

    Java设计模式-

    - 这类模式主要关注对象之间的责任分配和交互方式,包括策略模式、模板方法模式、观察者模式、迭代器模式、命令模式、责任链模式、备忘录模式、解释器模式、状态模式、访问者模式等。这些模式分别在决策制定、算法...

    java设计模式的应用

    - **命令模式**:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 - **状态模式**:允许一个对象在其内部状态改变时改变它的行为。对象看...

    Java设计模式-图解-附代码

    - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求或日志请求,同时也支持可撤销的操作。 - 解释器模式:给定一个语言,定义它的文法表示,并提供一个解释器来处理这种语言中的句子。 - 迭代器...

    JAVA设计模式-原则和23种设计模式归纳总结

    JAVA设计模式-原则和23种设计模式归纳总结 本资源主要介绍了JAVA设计模式的原则和23种设计模式的总结。设计模式是软件设计中的一种解决方案,能够使软件系统更加灵活、可维护和可扩展。本资源首先介绍了设计模式的...

    java---------设计模式

    - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求或日志请求等。 - 解释器模式:提供一个语言的文法表示,并定义了一个接口,该接口支持解析此语言的句子。 - 迭代器模式:提供一种方法顺序访问...

Global site tag (gtag.js) - Google Analytics