디자인 모드 8 편: 명령 모드

7175 단어
명령 모드
본문 번역https://www.journaldev.com/1624/command-design-pattern
명령 자 모드 에서 요청 은 호출 자 에 게 보 내 고 호출 자 는 봉인 명령 모드 의 대상 에 게 전달 합 니 다. 해당 하 는 방법 으로 지정 한 동작 을 수행 합 니 다.클 라 이언 트 프로그램 이 수신 자 를 만 든 다음 명령 에 추가 한 다음 호출 자 를 계속 만 들 고 명령 자 를 참조 하여 동작 을 수행 합 니 다.클 라 이언 트 프로그램 이 동작 을 수행 할 때 호출 자 와 명령 자 에 의존 해 야 합 니 다.
Command Design Pattern Example
우 리 는 실제 생활 장면 을 사용 하여 명령 자 모드 를 증명 합 니 다. 만약 에 우리 가 파일 시스템 을 제공 하려 면 실 용적 인 열 림, 읽 기, 쓰기, 닫 기 기능 을 가지 고 있 습 니 다.이 파일 시스템 은 윈도, 유 닉 스 등 다양한 조작 을 지원 한다.이러한 시스템 을 통합 하기 위해 첫 번 째 로 해 야 할 일 은 파일 을 받 는 클래스 를 만 들 고 가장 실제 적 인 작업 을 하 는 것 입 니 다. 따라서 우 리 는 인터페이스 프로 그래 밍 을 해 야 합 니 다. 우 리 는 FileSystemReceiver 인 터 페 이 스 를 만들어 야 합 니 다. 이 인 터 페 이 스 는 서로 다른 운영 체제 류 에 의 해 실 현 될 것 입 니 다. 예 를 들 어 Windows, Unix, Solaris 등 입 니 다.
Command Pattern Receiver Classes
package com.journaldev.design.command;

public interface FileSystemReceiver {

    void openFile();
    void writeFile();
    void closeFile();
}
FileSystemReceiver 인 터 페 이 스 는 추상 적 인 방법 을 정 의 했 습 니 다. 간단하게 보기 위해 저 는 두 개의 수신 자 를 만 들 려 고 합 니 다. UnixFileSystemReceiverUnixFileSystemReceiver 그들 은 유 닉 스 와 Windows 시스템 에 운 송 될 것 입 니 다.
package com.journaldev.design.command;

public class UnixFileSystemReceiver implements FileSystemReceiver {

    @Override
    public void openFile() {
        System.out.println("Opening file in unix OS");
    }

    @Override
    public void writeFile() {
        System.out.println("Writing file in unix OS");
    }

    @Override
    public void closeFile() {
        System.out.println("Closing file in unix OS");
    }
}
package com.journaldev.design.command;

public class WindowsFileSystemReceiver implements FileSystemReceiver {

    @Override
    public void openFile() {
        System.out.println("Opening file in Windows OS");
        
    }

    @Override
    public void writeFile() {
        System.out.println("Writing file in Windows OS");
    }

    @Override
    public void closeFile() {
        System.out.println("Closing file in Windows OS");
    }

}

오 버 라 이 드 주석 눈 치 챘 어 요?이 주석 을 왜 사용 하 는 지 알 고 싶다 면 자바 annotations 및 override annotation benefits 를 참고 하 십시오.번역자 주: 비교적 큰 장점 은 바로 아버지 류 의 방법 을 바 꾸 면 자 류 가 경계선 을 보고 하여 당신 의 주 의 를 끌 수 있다 는 것 이다.현재 수신 자 는 이미 준비 가 되 어 있 습 니 다. 우 리 는 명령 자 를 만 들 수 있 습 니 다.
Command Pattern Interface and Implementations
우 리 는 인터페이스 나 추상 류 를 실현 하여 기초 명령 자 를 만 들 수 있다. 이것 은 디자인 결정 이 고 당신 의 수요 에 달 려 있다.
package com.journaldev.design.command;

public interface Command {

    void execute();
}

지금 우 리 는 서로 다른 유형의 실현 자 를 만들어 야 한다. 왜냐하면 우 리 는 세 가지 동작 이 있 기 때문에 openFile, writeFile, closeFile;각 명령 자 구현 클래스 는 지정 한 수신 자 에 게 요청 을 보 내기 때문에 세 개의 명령 자 를 만 듭 니 다.
package com.journaldev.design.command;

public class OpenFileCommand implements Command {

    private FileSystemReceiver fileSystem;
    
    public OpenFileCommand(FileSystemReceiver fs){
        this.fileSystem=fs;
    }
    @Override
    public void execute() {
        //open command is forwarding request to openFile method
        this.fileSystem.openFile();
    }

}
package com.journaldev.design.command;

public class CloseFileCommand implements Command {

    private FileSystemReceiver fileSystem;
    
    public CloseFileCommand(FileSystemReceiver fs){
        this.fileSystem=fs;
    }
    @Override
    public void execute() {
        this.fileSystem.closeFile();
    }

}
package com.journaldev.design.command;

public class WriteFileCommand implements Command {

    private FileSystemReceiver fileSystem;
    
    public WriteFileCommand(FileSystemReceiver fs){
        this.fileSystem=fs;
    }
    @Override
    public void execute() {
        this.fileSystem.writeFile();
    }

}

현재 수신 자 와 명령 자가 모두 준 비 를 마 쳤 기 때문에 우 리 는 다음 에 호출 자 를 실현 할 것 이다.
Command Pattern Invoker Class
호출 자 는 명령 자 를 봉인 하고 명령 자 에 게 요청 을 전달 한 후 실행 하 는 간단 한 클래스 입 니 다.
package com.journaldev.design.command;

public class FileInvoker {

    public Command command;
    
    public FileInvoker(Command c){
        this.command=c;
    }
    
    public void execute(){
        this.command.execute();
    }
}

우리 의 파일 시스템 은 현재 준비 가 다 되 었 습 니 다. 우 리 는 작은 테스트 클 라 이언 트 를 써 서 테스트 할 수 있 습 니 다. 그러나 그 전에 나 는 효용 있 는 방법 을 만 들 려 고 합 니 다.우 리 는 시스템 류 System class 를 사용 하여 운영 체제 의 정 보 를 얻 었 기 때문에 우 리 는 공장 모델 로 적당 한 종 류 를 되 돌려 주 었 다.
package com.journaldev.design.command;

public class FileSystemReceiverUtil {
    
    public static FileSystemReceiver getUnderlyingFileSystem(){
         String osName = System.getProperty("os.name");
         System.out.println("Underlying OS is:"+osName);
         if(osName.contains("Windows")){
             return new WindowsFileSystemReceiver();
         }else{
             return new UnixFileSystemReceiver();
         }
    }
    
}

지금 당장 명령 자 모드 를 테스트 합 시다.
package com.journaldev.design.command;

public class FileSystemClient {

    public static void main(String[] args) {
        //Creating the receiver object
        FileSystemReceiver fs = FileSystemReceiverUtil.getUnderlyingFileSystem();
        
        //creating command and associating with receiver
        OpenFileCommand openFileCommand = new OpenFileCommand(fs);
        
        //Creating invoker and associating with Command
        FileInvoker file = new FileInvoker(openFileCommand);
        
        //perform action on invoker object
        file.execute();
        
        WriteFileCommand writeFileCommand = new WriteFileCommand(fs);
        file = new FileInvoker(writeFileCommand);
        file.execute();
        
        CloseFileCommand closeFileCommand = new CloseFileCommand(fs);
        file = new FileInvoker(closeFileCommand);
        file.execute();
    }

}

눈치 채 셨 나 요?FileSystemClient 는 파일 을 쓰 려 면 CloseFileCommand 클래스 를 만 들 지 말 아야 합 니 다.FileSystemClient 는 수신 자 를 인자 로 명령 자 에 추가 한 다음 호출 자 는 명령 자 를 호출 하여 해당 하 는 프로그램 을 수행 하 는 것 도 책임 집 니 다.
출력:
Underlying OS is:Mac OS X
Opening file in unix OS
Writing file in unix OS
Closing file in unix OS

Command Pattern Important Points
  • 명령 자 는 명령 자 모델 의 핵심 으로 그 실현 류 에 대해 조약 을 정의 했다.
  • 수신 자 와 명령 자 사 이 는 분리 된다.
  • Command implementation classes chose the method to invoke on receiver object, for every method in receiver there will be a command implementation. It works as a bridge between receiver and action methods.
  • 호출 자 는 명령 자 에 게 요청 을 전달 하 는 것 만 책임 진다.
  • 클 라 이언 트 는 명령 자 와 수신 자 를 예화 시 킨 다음 에 그들 을 연결 시 킵 니 다.
  • 클 라 이언 트 도 실례 화 호출 자 를 책임 진다.
  • 명령 자 모드 는 높 은 확장 성 을 가진다. 우 리 는 재 수신 자 에 방법 을 추가 한 다음 에 새로운 명령 자 를 만 들 수 있다.이 과정 은 다른 곳 의 코드 를 변경 할 필요 가 없다.
  • 명령 모드 의 단점 은 코드 가 지루 하고 호출 관계 가 많아 곤 혹 스 럽 기 쉽다 는 것 이다.

  • Command Design Pattern JDK Example
    Runnable 인터페이스 에서 이 디자인 모델 을 사 용 했 습 니 다.

    좋은 웹페이지 즐겨찾기