Java设计模式之命令模式

  • 命令模式

    将一个请求封装为一个对象,从而可以用不同的请求对对象进行参数化。

  • 适用性

    1)抽象出待执行的动作以参数化某对象。
    2)支持取消操作。
    3)支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。

  • 举例

    例如古代皇帝想做什么就做什么,只需要下达命令即可。

  • UML类图
    命令模式(Command)

  • 代码示例

    • 定义一个接收者,知道如何实施与执行一个请求相关的操作
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 执行者
       * @auther jinsx
       * @date 2019-05-10 11:14
       */
      public class Receiver {
          public Object add(Object obj){
              System.out.println("添加任务:" + obj);
              return "成功添加任务";
          }
          public Object delete(Object obj){
              System.out.println("删除任务:" + obj);
              return "成功删除任务";
          }
          public Object change(Object obj){
              System.out.println("修改任务:" + obj);
              return "成功修改任务";
          }
          public Object find(Object obj){
              System.out.println("查看任务:" + obj);
              return "成功查看任务";
          }
      }
      
    • 声明执行操作的抽象类
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 命令
       * @auther jinsx
       * @date 2019-05-10 15:42
       */
      public abstract class Command {
          // 定义执行者引用
          protected Receiver receiver;
          public Command(Receiver receiver) {
              this.receiver = receiver;
          }
          // 要执行的任务
          public abstract Object execute(Object obj);
      }
      
    • 将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute
      添加命令
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 添加命令
       * @auther jinsx
       * @date 2019-05-10 15:44
       */
      public class AddCommand extends Command {
          public AddCommand(Receiver receiver) {
              super(receiver);
          }
          @Override
          public Object execute(Object obj) {
              System.out.println("---先查看,再添加,不做重复工作---");
              receiver.find(obj);
              return receiver.add(obj);
          }
      }
      
      删除命令
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 删除命令
       * @auther jinsx
       * @date 2019-05-10 15:54
       */
      public class DeleteCommand extends Command {
      	public DeleteCommand(Receiver receiver) {
      		super(receiver);
      	}
      	@Override
      	public Object execute(Object obj) {
      		System.out.println("---不管有没有,直接删除就行---");
      		return receiver.delete(obj);
      	}
      }
      
      修改命令
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 修改命令
       * @auther jinsx
       * @date 2019-05-10 15:56
       */
      public class ChangeCommand extends Command {
      	public ChangeCommand(Receiver receiver) {
      		super(receiver);
      	}
      	@Override
      	public Object execute(Object obj) {
      		System.out.println("---修改前,要查看是否有此任务---");
      		receiver.find(obj);
      		return receiver.change(obj);
      	}
      }
      
      查看命令
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 查看命令
       * @auther jinsx
       * @date 2019-05-10 16:01
       */
      public class FindCommand extends Command {
      	public FindCommand(Receiver receiver) {
      		super(receiver);
      	}
      	@Override
      	public Object execute(Object obj) {
      		System.out.println("---想看,就给你看---");
      		return receiver.find(obj);
      	}
      }
      
    • 调用者
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 调用者
       * @auther jinsx
       * @date 2019-05-10 16:06
       */
      public class Invoker {
          private Command command;
          public void setCommand(Command command) {
              this.command = command;
          }
          public Object execute(Object obj){
              return command.execute(obj);
          }
      }
      
    • 创建一个测试类
      package com.jin.demo.DesignPatterns.Command;
      
      /**
       * 测试类
       * @auther jinsx
       * @date 2019-05-10 16:15
       */
      public class TestCommand {
          public static void main(String[] args) {
              System.out.println(">>>始皇陛下今天心血来潮,建个阿房宫玩玩吧");
              Invoker i = new Invoker();
              i.setCommand(new AddCommand(new Receiver()));
              System.out.println(i.execute("建设阿房宫"));
              System.out.println(">>>始皇陛下今天有了新的想法");
              i.setCommand(new ChangeCommand(new Receiver()));
              System.out.println(i.execute("修改阿房宫建设位置"));
              System.out.println(">>>始皇陛下今天想看看阿房宫建设进度");
              i.setCommand(new FindCommand(new Receiver()));
              System.out.println(i.execute("查看阿房宫建设进度"));
              System.out.println(">>>始皇陛下今天醒悟啦");
              i.setCommand(new DeleteCommand(new Receiver()));
              System.out.println(i.execute("终止建设阿房宫"));
          }
      }
      
    • 执行测试结果
      >>>始皇陛下今天心血来潮,建个阿房宫玩玩吧
      ---先查看,再添加,不做重复工作---
      查看任务:建设阿房宫
      添加任务:建设阿房宫
      成功添加任务
      >>>始皇陛下今天有了新的想法
      ---修改前,要查看是否有此任务---
      查看任务:修改阿房宫建设位置
      修改任务:修改阿房宫建设位置
      成功修改任务
      >>>始皇陛下今天想看看阿房宫建设进度
      ---想看,就给你看---
      查看任务:查看阿房宫建设进度
      成功查看任务
      >>>始皇陛下今天醒悟啦
      ---不管有没有,直接删除就行---
      删除任务:终止建设阿房宫
      成功删除任务
      
  • 点击Java之23种设计模式查看更多的设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值