명령 모드 (1)

취소 가능 한 동작
        취소 가능 한 동작 은 이 동작 을 포기 하고 실행 되 지 않 은 상태 로 돌아 간 다 는 뜻 이다.이 기능 은 매우 중요 한 기능 으로 거의 모든 GUI 응용 프로그램 에서 동작 을 취소 하 는 기능 이 있다.GUI 메뉴 는 명령 모드 의 가장 전형 적 인 응용 프로그램 중 하나 이기 때문에 항상 메뉴 에서 이러한 메뉴 항목 을 취소 할 수 있 습 니 다.        기왕 이렇게 자주 쓰 는 바 에 야 어떻게 실현 해 야 합 니까?        두 가지 기본 적 인 사고 로 취소 가능 한 조작 을 실현 한다. 하 나 는 보상 식 이 고 반 조작 식 이 라 고도 부른다. 예 를 들 어 취소 되 는 조작 은 추가 적 인 기능 이 고 취소 되 는 실현 은 감소 하 는 기능 이 된다.같은 이치 로 취 소 된 조작 은 열 린 기능 이 고 취소 의 실현 은 닫 힌 기능 이 된다.        또 다른 방식 은 저장 복구 식 이다. 조작 전의 상 태 를 기록 한 다음 에 조작 을 취소 하려 고 할 때 바로 회복 하면 된다 는 뜻 이다.        여기 서 첫 번 째 방식 은 보상 식 이나 반작용 식 이 고 두 번 째 방식 은 비망록 모델 에 넣 어 설명 하 는 것 이다.취소 가능 한 기능 을 잘 이해 할 수 있 도록 하나의 예 로 설명 하 는 것 이 좋 습 니 다.1: 범례 수요        계산기 의 기능 을 고려 하면 가장 간단 한 것 은 가감 법 연산 만 실현 할 수 있 고 지금 은 이 계산기 가 취소 가능 한 조작 을 지원 하도록 해 야 한다.2: 보상 식 또는 반 조작 식 해결 방안 (1) 명령 인 터 페 이 스 를 실현 하기 전에 진정 으로 계산 을 실현 하 는 인 터 페 이 스 를 정의 합 니 다. 명령 이 없 으 면 아무것도 할 수 없습니다. 연산 을 조작 하 는 인터페이스의 예제 코드 는 다음 과 같 습 니 다.
/** 
 *         
 */  
public interface OperationApi {  
    /** 
     *            
     * @return          
     */  
    public int getResult();  
    /** 
     *            
     * @param result          
     */  
    public void setResult(int result);  
    /** 
     *      
     * @param num       
     */  
    public void add(int num);  
    /** 
     *      
     * @param num       
     */  
    public void substract(int num);  
}

인 터 페 이 스 를 정 의 했 습 니 다. 가감 법의 실현 을 살 펴 보 겠 습 니 다. 예제 코드 는 다음 과 같 습 니 다.
/** 
 *    ,          
 */  
public class Operation implements OperationApi{  
    /** 
     *         
     */  
    private int result;  
    public int getResult() {  
        return result;  
    }  
    public void setResult(int result) {  
        this.result = result;  
    }     
    public void add(int num){ //        result += num; } public void substract(int num){ //        result -= num; }  
}

(2) 그 다음 에 추상 적 인 명령 인 터 페 이 스 를 사용 합 니 다. 취소 가능 한 기능 을 지원 해 야 하기 때문에 앞에서 처럼 실행 방법 을 정의 하 는 것 을 제외 하고 취소 작업 방법 도 정의 해 야 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
/** 
 *     ,       ,        
 */  
public interface Command {  
    /** 
     *           
     */  
    public void execute();  
    /** 
     *             
     */  
    public void undo();  
}

(3) 명령 을 실현 해 야 한다. 구체 적 인 명령 은 덧셈 명령 과 뺄셈 명령 으로 나 뉘 는데 먼저 덧셈 명령 의 실현 을 살 펴 보 자. 예제 코드 는 다음 과 같다.
/** 
 *             
 */  
public class AddCommand implements Command{  
    /** 
     *             
     */  
    private OperationApi operation = null;  
    /** 
     *      ,          
     */  
    private int opeNum;  
      
    public void execute() { //            ,         this.operation.add(opeNum); } public void undo() { //             //        ,              this.operation.substract(opeNum); }  
              /** 
     *     ,            
     * @param operation           
     * @param opeNum        
     */  
    public AddCommand(OperationApi operation,int opeNum){  
        this.operation = operation;  
        this.opeNum = opeNum;  
    }  
}

감법 명령 은 덧셈 과 유사 하 다. 다만 실현 할 때 덧셈 과 반대로 되 었 을 뿐이다. 예제 코드 는 다음 과 같다.
/** 
 *             
 */  
public class SubstractCommand implements Command{  
    /** 
     *             
     */  
    private OperationApi operation = null;  
    /** 
     *      ,          
     */  
    private int opeNum;  
    /** 
     *     ,            
     * @param operation           
     * @param opeNum        
     */  
    public SubstractCommand(OperationApi operation,int opeNum){  
        this.operation = operation;  
        this.opeNum = opeNum;  
    }     
      
    public void execute() { //            ,         this.operation.substract(opeNum); } public void undo() { //             //        ,              this.operation.add(opeNum); }  
}

(4) 계산 기 를 살 펴 봐 야 한다. 계산 기 는 Invoker 에 해당 하고 여러 명령 대상 을 가지 고 있 으 며 계산 기 는 취소 가능 한 작업 을 실현 하 는 곳 이다.취소 가능 한 기능 을 잘 이해 하기 위해 서 는 취소 가능 한 연산 자 류 가 어떤 모습 인지 살 펴 본 다음 에 취소 가능 한 기능 예 시 를 추가 합 니 다.예제 코드 는 다음 과 같다.
/** 
 *     ,         、     
 */  
public class Calculator {  
    /** 
     *             
     */  
    private Command addCmd = null;  
    /** 
     *             
     */  
    private Command substractCmd = null;  
    /** 
     *             
     * @param addCmd           
     */  
    public void setAddCmd(Command addCmd) {  
        this.addCmd = addCmd;  
    }  
    /** 
     *             
     * @param substractCmd           
     */  
    public void setSubstractCmd(Command substractCmd) {  
        this.substractCmd = substractCmd;  
    }     
    /** 
     *        ,        
     */  
    public void addPressed(){  
        this.addCmd.execute();  
    }  
    /** 
     *        ,        
     */  
    public void substractPressed(){  
        this.substractCmd.execute();  
    }  
}

 현 재 는 앞의 예 와 크게 다 르 지 않 은 것 처럼 보이 지만 지금 은 이 기본 적 인 실현 에 취소 가능 한 기능 을 추가 합 니 다.취소 가능 한 작업 을 수행 하려 면 먼저 작 동 한 명령 을 기록 하여 명령 의 과거 기록 목록 을 만 들 고 취소 할 때 마지막 부터 취소 해 야 합 니 다.따라서 우 리 는 먼저 계산기 류 에 명령 기록 목록 을 추가 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
/** 
*           ,       
*/  
private List undoCmds = new ArrayList();

언제 명령 의 역사 기록 에 값 을 추가 합 니까?        간단 합 니 다. 정 답 은 모든 조작 버튼 이 눌 렸 을 때, 즉 덧셈 버튼 이나 뺄셈 단 추 를 조작 할 때 예제 코드 는 다음 과 같 습 니 다.
     public void addPressed(){  
    this.addCmd.execute();  
    //              
    undoCmds.add(this.addCmd);  
}  
public void substractPressed(){  
    this.substractCmd.execute();  
    //              
    undoCmds.add(this.substractCmd);  
}

그리고 계산기 클래스 에 취소 단 추 를 추가 합 니 다. 누 르 면 명령 기록 에서 마지막 명령 을 꺼 내 서 취소 합 니 다. 취소 가 완료 되면 취소 한 명령 을 기록 에서 삭제 합 니 다. 이 명령 을 실행 하지 않 은 것 과 같 습 니 다. 예제 코드 는 다음 과 같 습 니 다.
public void undoPressed(){  
    if(this.undoCmds.size()>0){  
        //             
        Command cmd = this.undoCmds.get(this.undoCmds.size()-1);  
        cmd.undo();  
        //            ,  
        this.undoCmds.remove(cmd);  
    }else{  
        System.out.println("   ,        ");  
    }  
}

같은 방식 으로 복구 기능 도 실현 할 수 있 고 복구 가능 한 목록 을 설정 하기 위해 복구 가 필요 할 때 목록 에서 마지막 명령 을 꺼 내 다시 실행 하면 됩 니 다. 예제 코드 는 다음 과 같 습 니 다.
/** 
*           ,       
*/  
private List redoCmds = new ArrayList();

그럼 언제 이 집합 에 값 을 부여 합 니까?복구 명령 데 이 터 는 취소 명령 에서 유래 한 것 이 므 로 취소 가 있어 야 복구 가 가능 하 므 로 취소 할 때 이 집합 에 값 을 부여 하고 취소 명령 이 삭제 되 기 전에 값 을 부여 해 야 합 니 다.예제 코드 는 다음 과 같다.
public void undoPressed(){  
    if(this.undoCmds.size()>0){  
        //             
        Command cmd = this.undoCmds.get(this.undoCmds.size()-1);  
        cmd.undo();  
        //         ,                    this.redoCmds.add(cmd);  
        //            ,  
        this.undoCmds.remove(cmd);  
    }else{  
        System.out.println("   ,        ");  
    }  
}

그렇다면 어떻게 회복 을 이 룰 수 있 을 까?예시 코드 를 보십시오.
public void redoPressed(){  
    if(this.redoCmds.size()>0){  
        //             
        Command cmd = this.redoCmds.get(this.redoCmds.size()-1);  
        cmd.execute();        
        //                   this.undoCmds.add(cmd);  
        //              
        this.redoCmds.remove(cmd);  
    }else{  
        System.out.println("   ,        ");  
    }  
}

자, 계산기 류 를 단계별 로 설명 하고 완전한 계산기 류 의 코드 를 보 겠 습 니 다.
/** 
 *     ,         、    ,           
 */  
public class Calculator {  
    /** 
     *           ,       
     */  
    private List undoCmds = new ArrayList();  
    /** 
     *           ,       
     */  
    private List redoCmds = new ArrayList();  
      
    private Command addCmd = null;  
    private Command substractCmd = null;  
    public void setAddCmd(Command addCmd) {  
        this.addCmd = addCmd;  
    }  
    public void setSubstractCmd(Command substractCmd) {  
        this.substractCmd = substractCmd;  
    }     
    public void addPressed(){  
        this.addCmd.execute();  
        //              
        undoCmds.add(this.addCmd);  
    }  
    public void substractPressed(){  
        this.substractCmd.execute();  
        //              
        undoCmds.add(this.substractCmd);  
    }  
    public void undoPressed(){  
        if(this.undoCmds.size()>0){  
            //             
            Command cmd = this.undoCmds.get(undoCmds.size()-1);  
            cmd.undo();  
            //         ,                     
            this.redoCmds.add(cmd );  
            //            ,  
            this.undoCmds.remove(cmd);  
        }else{  
            System.out.println("   ,        ");  
        }  
    }  
    public void redoPressed(){  
        if(this.redoCmds.size()>0){  
            //             
            Command cmd = this.redoCmds.get(redoCmds.size()-1);  
            cmd.execute();        
            //                    
            this.undoCmds.add(cmd);  
            //              
            this.redoCmds.remove(cmd);  
        }else{  
            System.out.println("   ,        ");  
        }  
    }  
}

(5) 드디어 수확 할 때 가 되 었 습 니 다. 클 라 이언 트 를 쓰 고 명령 과 수신 자 를 조립 한 다음 에 명령 을 몇 번 조작 하여 취소 와 복구 기능 을 테스트 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
public class Client {  
    public static void main(String[] args) {  
        //1:          
        //       
        OperationApi operation = new Operation();  
        //      ,           
        AddCommand addCmd = new AddCommand   (operation,5);  
        SubstractCommand substractCmd =   
                                    new SubstractCommand(operation,3);  
          
        //2:         ,         
        Calculator calculator = new Calculator();  
        calculator.setAddCmd(addCmd);  
        calculator.setSubstractCmd(substractCmd);  
          
        //3:      ,      
        calculator.addPressed();  
        System.out.println("           :"  
                                     +operation.getResult());  
        calculator.substractPressed();  
        System.out.println("           :"  
                                     +operation.getResult());  
          
        //      
        calculator.undoPressed();  
        System.out.println("         :"  
                                     +operation.getResult());  
        calculator.undoPressed();  
        System.out.println("          :"  
                                     +operation.getResult());  
          
        //      
        calculator.redoPressed();  
        System.out.println("           :"  
                                     +operation.getResult());  
        calculator.redoPressed();  
        System.out.println("            :"  
                                     +operation.getResult());  
    }  
}

(6) 실행 하고 결 과 를 보고 취소 하고 복구 할 수 있 는 작업 을 즐 깁 니 다. 결 과 는 다음 과 같 습 니 다.
           :5  
           :2  
         :5  
          :0  
           :5  
            :2

 다음으로 전송:http://sishuok.com/forum/blogPost/list/98.html
   cc 선생님 의 디자인 모델 은 제 가 현재 본 가장 상세 하고 실천 적 인 튜 토리 얼 입 니 다.

좋은 웹페이지 즐겨찾기