【JAVA】设计模式之命令模式(Command模式)的使用分析
来源:互联网 发布:淘宝会员俱乐部 编辑:程序博客网 时间:2024/05/21 15:51
转载于:http://blog.chinaunix.net/uid-29140694-id-4134135.html
命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式。
首先看下GOF对命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式主要应用于将行为调用者与实现者解耦。比如我们以前惯用的写代码的方式是LogicProcess logic = new LogicProcess(); 然后紧接着调用实现方法logic.process(),这种写法其实非常普遍,但这种写法把行为调用者和行为实现者耦合在了一起,一般情况下并没有什么问题的,但当调用逻辑比较复杂或则调用行为有多种实现时就非常不利于程序的扩展。
命令模式的适用场景描述:
(1)整个调用过程比较繁杂,或者存在多处这种调用。使用Command类对该调用加以封装,便于功能的再利用。
(2)调用前后需要对调用参数进行某些处理。
(3)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
命令模式结构图如下:
命令模式的参与角色:
(1)抽象命令角色(Command):抽象命令,包含命令执行的抽象方法
(2)命令接收者(Receiver):命令接收者角色,它包含所有命令的具体行为实现方法。
(3)具体命令角色(ConcreteCommand):它包含一个命令接收者对象,并调用接收者的对象相应实现方法。
(4)命令调用者角色(Invoker):提供给客户端调用,接收客户端所传递的具体命令对象。
下面看具体代码实现:
1、第一个文件抽象命令角色:Command.java
点击(此处)折叠或打开
- /**
- * 抽象命令接口
- */
- public interface Command {
- /**
- * 命令执行方法
- */
- public void execute();
- }
2、第二个文件命令接收者角色:Document.java
点击(此处)折叠或打开
- /**
- * 命令接收者 Receiver
- */
- public class Document {
- /**
- * 操作实体对象
- */
- public static StringBuffer sbr = new StringBuffer();
-
- /**
- * 计数器
- */
- public static int count = 0;
-
- /**
- * 撤销实现方法
- */
- public void undo(){
- System.out.println("调用撤销实现方法,字符串递减");
- sbr.deleteCharAt(sbr.length()-1);
- count --;
- System.out.println("当前文本为:" + sbr.toString());
- }
-
- /**
- * 恢复实现方法
- */
- public void redo(){
- System.out.println("调用恢复实现方法,字符串递加");
- this.sbr.append(count);
- count ++;
- System.out.println("当前文本为:" + sbr.toString());
- }
-
- /**
- * 执行实现方法
- */
- public void add(){
- System.out.println("调用执行实现方法,字符串递加");
- this.sbr.append(count);
- count ++;
- System.out.println("当前文本为:" + sbr.toString());
- }
- }
点击(此处)折叠或打开
- /**
- * 执行命令实现类
- */
- public class AddCommand implements Command {
- /**
- * 命令接受者对象
- */
- public Document doucment;
-
- /**
- * 构造方法
- * @param document
- */
- public AddCommand(Document document){
- this.doucment = document;
- }
-
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- this.doucment.add();
- }
- }
点击(此处)折叠或打开
- /**
- * 撤销命令实现类
- */
- public class UndoCommand implements Command {
- /**
- * 命令接受者对象
- */
- public Document doucment;
-
- /**
- * 构造方法
- * @param document
- */
- public UndoCommand(Document document){
- this.doucment = document;
- }
-
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- this.doucment.undo();
- }
- }
点击(此处)折叠或打开
- /**
- * 恢复命令实现类
- */
- public class RedoCommand implements Command {
- /**
- * 命令接受者对象
- */
- public Document doucment;
-
- /**
- * 构造方法
- * @param document
- */
- public RedoCommand(Document document){
- this.doucment = document;
- }
-
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- this.doucment.redo();
- }
- }
点击(此处)折叠或打开
- /**
- * 提供给客户端的命令调用方法
- * @author feng
- *
- */
- public class Invoker {
- /**
- * 命令对象
- */
- public Command command;
-
- /**
- * 命令设置方法
- * @param command
- */
- public void setCommand(Command cmd){
- this.command = cmd;
- }
-
- /**
- * 命令执行方法
- */
- public void execute(){
- this.command.execute();
- }
- }
点击(此处)折叠或打开
- /**
- * 测试Main方法
- */
- public class TestMain {
- public static void main(String args[]){
- Document doc = new Document(); //文档实体对象
- AddCommand addCmd = new AddCommand(doc); //具体命令实体对象
- UndoCommand undoCmd = new UndoCommand(doc); //具体命令实体对象
- RedoCommand redoCmd = new RedoCommand(doc); //具体命令实体对象
- Invoker invoker = new Invoker(); //调用者对象
- invoker.setCommand(addCmd);
- invoker.execute();
- invoker.setCommand(addCmd);
- invoker.execute();
- invoker.setCommand(undoCmd);
- invoker.execute();
- invoker.setCommand(redoCmd);
- invoker.execute();
- }
- }
下面总结下命令模式的优点:
(1)命令模式将行为调用者和各种行为分隔开,降低程序的耦合,便于程序扩展。
(2)命令模式将行为的具体实现封装起来,客户端无需关心行为的具体实现。
(3)命令模式可为多种行为提供统一的调用入口,便于程序对行为的管理和控制。
- 【JAVA】设计模式之命令模式(Command模式)的使用分析
- Java设计模式-之Command命令模式
- java设计模式之命令模式Command
- java设计模式之命令模式Command
- 设计模式之Command(命令模式)
- 【设计模式】之命令模式(Command)
- 设计模式之命令模式(Command)
- 设计模式之命令模式(Command)
- 设计模式之命令模式(Command)
- Java设计模式----命令模式(Command)
- Java设计模式之--命令模式(Command)
- java设计模式之Command(菜单命令)
- java设计模式之Command(菜单命令)
- java设计模式之Command(命令)
- java设计模式----command模式(命令模式)
- 设计模式之Command(命令)
- JAVA设计模式之 命令模式【Command Pattern】
- 浅谈JAVA设计模式之——命令模式(Command)
- ScrollView嵌套TextView,让TextView可以滚动
- BZOJ 3240 构造矩阵+矩阵快速幂
- Latex使用小结
- Java RSA格式 转换与运算(转)
- linux安装部署git
- 【JAVA】设计模式之命令模式(Command模式)的使用分析
- bootstrap-table分页模板和获取表中的ID
- Java面试题大全(part_2)
- 好的博客地址
- 消息队列之JMS消息服务讲解
- Java File renameTo方法重命名文件
- 事件document.Ready里的函数和外面的函数的区别
- CentOS7安装tftp服务器
- export 与 export default import 详解| es6