博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】—— 命令模式Commond
阅读量:5899 次
发布时间:2019-06-19

本文共 2895 字,大约阅读时间需要 9 分钟。

  模式意图

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

  典型的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!

 

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
Java中HashMap详解
查看>>
delphi基本语法
查看>>
沙盒目录介绍
查看>>
260. Single Number III
查看>>
Hadoop生态圈-Kafka的完全分布式部署
查看>>
css的border的solid
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
在 SELECT 查询中使用表表达式
查看>>