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

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

hot3.png

  前言:【】——————————by xingoo

  模式意图

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

  典型的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 }
View Code

  运行结果

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

 

转载于:https://my.oschina.net/u/204616/blog/545464

你可能感兴趣的文章
Java日志框架-Spring中使用Logback(Spring/Spring MVC)
查看>>
读书笔记--101个shell脚本 之#12--函数
查看>>
TCP/IP之(四)Delay ack 和 Nagle算法
查看>>
linux学习:selinux 禁用后(disabled)Linux系统无法正常启动解决
查看>>
关于tomcat和jetty对比(不喜欢jetty的勿看)
查看>>
grafana使用详解
查看>>
linux 文件同步 rsync+crontab
查看>>
git如何删除远程仓库的某次错误提交
查看>>
LAMP架构讲解(续一)
查看>>
linux下查看文件编码及修改编码
查看>>
VC中的延时
查看>>
算法与数据结构知识点
查看>>
在单位成功实验的PIX配置
查看>>
centos6.x使用dd命令制作u盘启动
查看>>
如何使用Wireshark抓包
查看>>
mysql 时间函数用法 集合
查看>>
技术宅男既要提升编程技术也要加强沟通能力
查看>>
开源计划--格瓦拉梦想(GUEVARA‘S DREAM)
查看>>
show full columns 和 checking privileges的说明
查看>>
电信网络拓扑图自动布局之总线
查看>>