`
dreamstone
  • 浏览: 287996 次
  • 来自: ...
文章分类
社区版块
存档分类

Java中的模式 --- 命令模式的(实现,功能,使用场合)及如何配合其它模式使用命令模式

阅读更多
一,命令模式的实现:
命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者,
下边是简单命令模式的实现代码实现:
 1public 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}

11public 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}

25public interface Command{
26    void execute();
27}

28public 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}

37public 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}

46public 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}

二,命令模式的功能,好处,或者说为什么使用命令模式?
上边的代码是否看起来很傻呢,本来可以这样简单实现的:
 1public class Client{
 2    public static void main(String[] args){
 3        Receiver receiver = new Receiver();
 4        receiver.actionOne();
 5        receiver.actionTwo();
 6    }

 7}

 8public 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

 1public 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}

23public 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,需求:有个固定命令组合会多次被执行
   解决:加入合成模式,实现方法如下,定义一个宏命令类:

 1public class MacroCommand implements Command{
 2    private List cmdList = new ArrayList();
 3
分享到:
评论

相关推荐

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

    2. **命令模式**: - **定义**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 - **适用性**:程序需要在不同的时间指定请求,并将其...

    java模式-java中的所有模式-java进阶必备···

    ### Java设计模式详解 #### 一、创建型模式 **1. 工厂方法模式(Factory Method)** - **定义**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - **应用场景*...

    23种设计模式的java实现源代码.rar

    14. **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求、支持撤销操作。Java中通过命令接口和具体命令类实现。 15. **解释器模式(Interpreter)**:给定一个语言,定义它的文法表示,...

    Java设计模式2

    - **命令模式**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 - **解释器模式**:给定一个语言,定义它的文法的一种表示,并定义一个...

    23种Java设计模式

    下面,我们将详细介绍这三类设计模式中包含的具体模式,并解析它们的概念、作用及应用场景。 创建模式: 1. 工厂模式(Factory):提供一个创建对象的接口,让子类决定实例化哪一个类。工厂模式主要用于创建对象,...

    java 的23种设计模式

    其他的设计模式包括代理模式、享元模式、外观模式、代理模式、责任链模式、命令模式、迭代器模式、备忘录模式、状态模式、策略模式、模板方法模式以及访问者模式等,它们各自都有独特的应用场景和价值。掌握这些模式...

    java23种设计模式

    命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 19、备忘录模式(Memento) 备忘录模式在不破坏封装性的前提下,捕获一个对象的...

    java设计模式

    - **命令模式(Command Pattern)** - **定义**:将一个请求封装为一个对象,从而使用户可用不同的请求对客户端进行参数化。 - **应用场景**:远程控制、宏命令等。 - **装饰模式(Decorator Pattern)** - **定义**...

    Java 23种设计模式

    命令模式将请求封装为一个对象,从而使用户可以用不同的请求、队列或者日志来参数化其他对象。它允许在不同的时间指定请求、排队和执行请求。常用于实现撤销功能、事务处理等。 #### 十、状态模式(State) 状态...

    java开发模式

    命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式可以将发送者与接收者解耦,使程序更加灵活。 #### 13. 访问者模式(Visitor...

    二十三种设计模式【PDF版】

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

    以轻松的语言比喻了java的23种模式

    在Java编程语言中,工厂模式是解决实例化对象的一种方法,其核心是定义一个用于创建对象的接口,但让实现这个接口的类来决定实例化哪个类。 **比喻理解:** 假设我们有一群MM(美女),不同的MM代表着不同的产品。...

    liang-faan_JavaDesignPattern.pdf

    文档中还提到了其他一些行为型设计模式,如命令模式(Command Pattern)、解释器模式(Interpreter Pattern)、迭代器模式(Iterator Pattern)、中介者模式(Mediator Pattern)、备忘录模式(Memento Pattern)、...

    关于飞行模式切换以及打开固定app代码

    在移动设备上,飞行模式是一种特殊的工作模式,它允许用户快速禁用所有无线通信功能,如蜂窝数据、Wi-Fi、蓝牙和GPS等,以符合飞机上的电子设备使用规定或在特定场合保护隐私。在Android系统中,飞行模式的切换通常...

    java—JDK内置工具使用技巧详解

    - **使用场景**:适用于需要实时监控 Java 应用程序资源使用情况的场合,特别是在调优阶段,可以帮助开发者理解应用性能瓶颈。 - **命令格式**:`jconsole [options]` ##### 3. jinfo - **功能**:jinfo 可以查询和...

    Java 面试中的陷阱

    `wait()`是Object类的方法,用于等待其他线程唤醒,通常在同步上下文中使用,以实现线程间的协作。 #### 7. **异常处理** - 异常层次结构:`Error`和`Exception`分别表示严重错误和可恢复异常,其中`...

Global site tag (gtag.js) - Google Analytics