디자인 모드 8 편: 명령 모드
본문 번역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
인 터 페 이 스 는 추상 적 인 방법 을 정 의 했 습 니 다. 간단하게 보기 위해 저 는 두 개의 수신 자 를 만 들 려 고 합 니 다. UnixFileSystemReceiver
와 UnixFileSystemReceiver
그들 은 유 닉 스 와 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 Design Pattern JDK Example
Runnable 인터페이스 에서 이 디자인 모델 을 사 용 했 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.