명령 모드 (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 선생님 의 디자인 모델 은 제 가 현재 본 가장 상세 하고 실천 적 인 튜 토리 얼 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.