设计模式-12-命令模式
简介:以对象来代表实际行动,命令对象可以把行动(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-命令模式相关推荐
- 设计模式 之 命令模式
2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 23种设计模式之命令模式和策略模式的区别
文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...
- 设计模式之命令模式(Command)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 一天学习一个设计模式之命令模式
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 代码如下: 1 /** 2 * 抽象命令角色类 3 */ ...
- python 命令模式_python 设计模式之命令模式
命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...
- JAVA设计模式什么鬼(命令模式)——作者:凸凹里歐
命令模式,通常指的是一个对象向另一个对象发送信息指令的行为模型,比如父母命令孩子写作业.将军命令士兵进攻等.我们经过分析拆解方法会得到三个模块,首先得有命令发送方,接着是被传递的命令本身,最后就是命令 ...
- plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式
点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...
- 设计模式复习-命令模式
#pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...
- [Head First设计模式笔记]----命令模式
命令模式定义:将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程 ...
最新文章
- node.js学习随笔
- linux 自学系列:chown 目录权限设置
- BJFU fudq的等式
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- sublime-text3 安装 emmet 插件
- Python爬虫:一些常用的爬虫技巧总结
- 有限元工程应用方法-ANSYS单元刚度矩阵计算理论详解
- Mac版idea快速切换大小写快捷键
- 038--想和权证恋个爱
- 《商务周刊》 别了 摩托罗拉
- pythonfor循环100次_Python之for循环
- 【MATLAB】基于油猴脚本和MATLAB下载原创力文档
- Java锁深入理解5——共享锁
- C语言的结构体前置声明,?C语言的不完整类型和前置声明
- 【代码迁移】Git动态更换版本仓库
- Java EE:第10章初识Spring MVC框架 课后习题
- matlab总路径最短问题,最短路径问题(急)
- 最全面的微信小程序渲染图片的方式
- Java 多线程 | 并发知识面试问答总结
- Python匿名函数
热门文章
- java 按钮不可用_java – 如何使按钮不可点击
- 现代信号处理 张贤达_著名科学家、清华大学张贤达教授逝世,享年 74岁
- pytorch bert文本分类_一起读Bert文本分类代码 (pytorch篇 三)
- 【2019JXCPC省赛:H】Rng(找规律+逆元)
- 【持续更新】并查集题目集合
- java selenium2_Selenium2(webdirver)入门之环境搭建(Java版)
- tensorflow.keras搭建gan神经网络,可直接运行
- 容器技术Docker K8s 24 容器服务ACK基础与进阶-日志管理
- ajax谷歌浏览器没缓存,从缓存AJAX请求会导致Chrome(Prevent Chrome from caching AJA
- c语言在线读程序,用C语言编写简单程序.doc