简介:以对象来代表实际行动,命令对象可以把行动(action) 及其参数封装起来,这些行动可以被

  • 重复多次
  • 取消(如果该对象有实现的话)
  • 取消后又再重做

目的:

总结:

组成:对象,行动
1,对象

package com.design.l.command;
/*** 程序设计员*/
public class Programmer {private String userName;public Programmer(String userName) {super();this.userName = userName;}public void handleDemand(){System.out.println("程序员 : " + userName + " ,正在处理新需求 ... ...");}public void handleBug(){System.out.println("程序员 : " + userName + " ,正在处理Bug ... ...");}public void handleProblem(){System.out.println("程序员 : " + userName + " ,正在处理线上问题 ... ...");}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}

package com.design.l.command;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 产品经理*/
public class ProductManager {//任务集合private List<TaskService> taskList;//程序员private List<Programmer> programmerList;private static final int TASK_MAX_NUM = 4;//任务最大数量private int idx = 0;public ProductManager(Programmer ... programmers) {super();this.taskList = new ArrayList<>();this.programmerList = Arrays.asList(programmers);}//新增任务public void addTaskToProduct(TaskService taskService){taskList.add(taskService);}//分配任务public void assignments(){TaskService[] copy = new TaskService[taskList.size() > TASK_MAX_NUM ? taskList.size() - TASK_MAX_NUM : 0];for ( int i = 0; i < TASK_MAX_NUM && i < taskList.size(); i ++){taskList.get(i).handle();}System.arraycopy(taskList.toArray(), TASK_MAX_NUM > taskList.size() ? taskList.size() : TASK_MAX_NUM, copy, 0, copy.length);taskList = Arrays.asList(copy);}//获取程序员public Programmer chooseProgrammer(){return programmerList.get(idx == programmerList.size() ? 0 : idx ++); }//打印出未处理的任务public void printTask(){if(taskList == null || taskList.size() == 0){System.out.println("----无任务----");return ;}System.out.println("----剩余任务----");for(TaskService task : taskList){System.out.println(task);}}}

package com.design.l.command;
/*** 销售人员*/
public class Sales {private String userName;private ProductManager productManager;//产品经理public Sales(String userName) {super();this.userName = userName;}public Sales(String userName, ProductManager productManager) {super();this.userName = userName;this.productManager = productManager;}public void putDemand(){System.out.println("业务员 : " + userName + ", 提出新需求  ... ... ");productManager.addTaskToProduct(new DemandTaskServiceImpl(productManager.chooseProgrammer()));}public void putBug(){System.out.println("业务员 : " + userName + ", 提出新Bug  ... ... ");productManager.addTaskToProduct(new BugTaskServiceImpl(productManager.chooseProgrammer()));}public void putProblem(){System.out.println("业务员 : " + userName + ", 提出线上问题     ... ... ");productManager.addTaskToProduct(new ProblemTaskServiceImpl(productManager.chooseProgrammer()));}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public ProductManager getProductManager() {return productManager;}public void setProductManager(ProductManager productManager) {this.productManager = productManager;}}

2,行为

package com.design.l.command;
/*** 任务接口*/
public interface TaskService {/*** 任务处理方法*/void handle();
}

package com.design.l.command;
/*** 新需求任务*/
public class DemandTaskServiceImpl implements TaskService {private Programmer programmer;public DemandTaskServiceImpl(Programmer programmer) {super();this.programmer = programmer;}@Overridepublic void handle() {programmer.handleDemand();}}

package com.design.l.command;
/*** Bug任务*/
public class BugTaskServiceImpl implements TaskService {private Programmer programmer;public BugTaskServiceImpl(Programmer programmer) {super();this.programmer = programmer;}@Overridepublic void handle() {programmer.handleBug();}}

package com.design.l.command;
/*** 线上问题任务*/
public class ProblemTaskServiceImpl implements TaskService {private Programmer programmer;public ProblemTaskServiceImpl(Programmer programmer) {super();this.programmer = programmer;}@Overridepublic void handle() {programmer.handleProblem();}}

3,Main

package com.design.l.command;
/*** 12-命令模式*/
public class MainTest {public static void main(String[] args) {Programmer programmerA = new Programmer("程序员A");ProductManager productManager = new ProductManager(programmerA);Sales salesA = new Sales("业务员A", productManager);Sales salesB = new Sales("业务员B", productManager);Sales salesC = new Sales("业务员C", productManager);Sales salesD = new Sales("业务员D", productManager);salesA.putDemand();salesA.putBug();salesB.putProblem();salesC.putBug();salesD.putProblem();productManager.assignments();productManager.printTask();productManager.assignments();productManager.printTask();}}

4,Result

业务员 : 业务员A, 提出新需求  ... ...
业务员 : 业务员A, 提出新Bug  ... ...
业务员 : 业务员B, 提出线上问题     ... ...
业务员 : 业务员C, 提出新Bug  ... ...
业务员 : 业务员D, 提出线上问题     ... ...
程序员 : 程序员A ,正在处理新需求 ... ...
程序员 : 程序员A ,正在处理Bug ... ...
程序员 : 程序员A ,正在处理线上问题 ... ...
程序员 : 程序员A ,正在处理Bug ... ...
----剩余任务----
com.design.l.command.ProblemTaskServiceImpl@15db9742
程序员 : 程序员A ,正在处理线上问题 ... ...
----无任务----

转载于:https://www.cnblogs.com/wanhua-wu/p/7222093.html

设计模式-12-命令模式相关推荐

  1. 设计模式 之 命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...

  2. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  3. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  4. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. 一天学习一个设计模式之命令模式

    命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 代码如下: 1 /** 2 * 抽象命令角色类 3 */ ...

  6. python 命令模式_python 设计模式之命令模式

    命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...

  7. JAVA设计模式什么鬼(命令模式)——作者:凸凹里歐

    命令模式,通常指的是一个对象向另一个对象发送信息指令的行为模型,比如父母命令孩子写作业.将军命令士兵进攻等.我们经过分析拆解方法会得到三个模块,首先得有命令发送方,接着是被传递的命令本身,最后就是命令 ...

  8. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  9. 设计模式复习-命令模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

  10. [Head First设计模式笔记]----命令模式

    命令模式定义:将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程 ...

最新文章

  1. node.js学习随笔
  2. linux 自学系列:chown 目录权限设置
  3. BJFU fudq的等式
  4. C++中三种正则表达式比较(C regex,C ++regex,boost regex)
  5. sublime-text3 安装 emmet 插件
  6. Python爬虫:一些常用的爬虫技巧总结
  7. 有限元工程应用方法-ANSYS单元刚度矩阵计算理论详解
  8. Mac版idea快速切换大小写快捷键
  9. 038--想和权证恋个爱
  10. 《商务周刊》 别了 摩托罗拉
  11. pythonfor循环100次_Python之for循环
  12. 【MATLAB】基于油猴脚本和MATLAB下载原创力文档
  13. Java锁深入理解5——共享锁
  14. C语言的结构体前置声明,?C语言的不完整类型和前置声明
  15. 【代码迁移】Git动态更换版本仓库
  16. Java EE:第10章初识Spring MVC框架 课后习题
  17. matlab总路径最短问题,最短路径问题(急)
  18. 最全面的微信小程序渲染图片的方式
  19. Java 多线程 | 并发知识面试问答总结
  20. Python匿名函数

热门文章

  1. java 按钮不可用_java – 如何使按钮不可点击
  2. 现代信号处理 张贤达_著名科学家、清华大学张贤达教授逝世,享年 74岁
  3. pytorch bert文本分类_一起读Bert文本分类代码 (pytorch篇 三)
  4. 【2019JXCPC省赛:H】Rng(找规律+逆元)
  5. 【持续更新】并查集题目集合
  6. java selenium2_Selenium2(webdirver)入门之环境搭建(Java版)
  7. tensorflow.keras搭建gan神经网络,可直接运行
  8. 容器技术Docker K8s 24 容器服务ACK基础与进阶-日志管理
  9. ajax谷歌浏览器没缓存,从缓存AJAX请求会导致Chrome(Prevent Chrome from caching AJA
  10. c语言在线读程序,用C语言编写简单程序.doc