1. 程式人生 > >設計模式-12-命令模式

設計模式-12-命令模式

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-命令模式