設計模式-12-命令模式
阿新 • • 發佈:2017-07-22
rod arraycopy ati length pre interface user 經理 this
簡介:以對象來代表實際行動,命令對象可以把行動(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; } @Override public 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; } @Override public 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; } @Override public 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 ... ... ----剩余任務---- [email protected] 程序員 : 程序員A ,正在處理線上問題 ... ... ----無任務----
設計模式-12-命令模式