【设计模式】—— 命令模式Commond

来源:互联网 发布:python ui 编辑:程序博客网 时间:2024/06/05 14:07

模式意图

       将一个请求封装成一个对象,从而对这个命令执行撤销、重做等操作。

  典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo、Redo等等。

  另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作。这个机制也是java事件的处理方式。

应用场景

       1 命令抽象成对象

  2 在不同的时刻,指定或者排队命令

  3 支持 Undo或者Redo等操作

  4 修改日志,当系统崩溃时,利用修改日志执行撤销

  5 原语操作上构造一个高层系统(不理解)

 模式结构


Invoker 命令的触发者,触发一个命令的执行。

/** * 命令的触发者,发送命令 * @author xingoo * */class Invoker{    private Commond commond;        public Invoker(Commond commond) {        this.commond = commond;    }        public void action(){        commond.excute();    }}

Receiver 命令的接受者,针对命令,执行一定的操作。

/** * 命令的接受者,负责接收命令,进行处理 * @author xingoo * */class Receiver{        public Receiver() {            }        public void action(){        System.out.println("Action of receiver!");    }}

Commond 命令的抽象接口

/** * 命令接口,定义命令的统一接口 * @author xingoo * */interface Commond{    public void excute();}

ConcreteCommond 具体的命令,关联一个接收者对象,当命令执行时,执行这个接收者对应的操作。

/** * 具体的命令 * @author xingoo * */class ConcreteCommond implements Commond{        private Receiver receiver;        public ConcreteCommond(Receiver receiver) {        this.receiver = receiver;    }        public void excute() {        receiver.action();    }    }

全部代码

 1 package com.xingoo.Commond; 2 /** 3  * 命令的触发者,发送命令 4  * @author xingoo 5  * 6  */ 7 class Invoker{ 8     private Commond commond; 9     10     public Invoker(Commond commond) {11         this.commond = commond;12     }13     14     public void action(){15         commond.excute();16     }17 }18 /**19  * 命令的接受者,负责接收命令,进行处理20  * @author xingoo21  *22  */23 class Receiver{24     25     public Receiver() {26         27     }28     29     public void action(){30         System.out.println("Action of receiver!");31     }32 }33 /**34  * 命令接口,定义命令的统一接口35  * @author xingoo36  *37  */38 interface Commond{39     public void excute();40 }41 /**42  * 具体的命令43  * @author xingoo44  *45  */46 class ConcreteCommond implements Commond{47     48     private Receiver receiver;49     50     public ConcreteCommond(Receiver receiver) {51         this.receiver = receiver;52     }53     54     public void excute() {55         receiver.action();56     }57     58 }59 /**60  * 客户端调用者61  * @author xingoo62  *63  */64 public class Client {65     public static void main(String[] args) {66         Receiver receiver = new Receiver();67         Commond commond = new ConcreteCommond(receiver);68         System.out.println("Commond register in here!");69         70         try {71             Thread.sleep(3000);72         } catch (InterruptedException e) {73             // TODO Auto-generated catch block74             e.printStackTrace();75         }76         77         System.out.println("Commond excute in here!");78         Invoker invoker = new Invoker(commond);79         invoker.action();80     }81 }
运行结果

Commond register in here!Commond excute in here!Action of receiver!