본문 바로가기

코딩/Software Architecture

[GoF Design Pattern] Command

* Command Pattern

Command : 하나의 명령(기능)을 객체화한 패턴

객체는 전달 및 보관할 수 있어 명령(기능)을 전달(메서드의 인자를 통해)하고 보관(메모리, DBMS에)할 수 있게 됨. 즉 데이터가 아닌 행위를 보관. 또 네트워크를 통해 전달해 또 다른 컴퓨터에 전달해 기능을 수행할 수 있음.

배치 실행, Undo/Redo, 우선순위가 높은 명령을 먼저 실행하기 등이 가능해짐.

 (배치 실행 : 기능들을 한 번에 모아서 실행

  Undo/Redo : 이미 실행한 기능을 되돌리거나 다시 실행)

 

Command 인터페이스와 이를 구현하는 5개의 클래스. 각 5개 클래스는 자신만의 고유한 기능을 가짐.

ClearCommand : 모두 지우기

PrintCommand : 원하는 문자열 출력

MoveCommand : 출력 위치 지정

ColorCommand : 출력 문자열 색상 지정

- 각 클래스는 오직 자신의 기능 수행에 초점을 맞춤.

 

CommandGroup : Command 객체를 여러 개 담아 배치 기능 구현에 이용될 수 있음.

Command Interface 기능을 수행하는 run() 매서드만 가지고 있다.

public interface Command {
    public void run();
}
// Undo 가 필요하다면 여기에서 구현 필요

Command를 Implements 하는 4개의 Command.

public class ClearCommand implements Command {

    @Override
    public void run() {
    	System.out.print("\033[H\033[2J");
        System.out.flush();
    }
}
public class PrintCommand implements Command {
    private String content;
    
    public PrintCommand(String content) {
    	this.content = content;
    }
    
    @Override
    public void run() {
    	System.out.println(content);
    }
}
public class MoveCommand implements Command {
    private int x;
    private int y;
    
    public MoveCommand(int x, int y) {
    	this.x = x;
        this.y = y;
    }

    @Override
    public void run() {
    	System.out.print(String.format("%c[%d;%df", 0x1B, y, x));
    }
}
public class ColorCommand implement Command {
    public enum Color {
    	BLACK("\u001B[30m"), RED("\u001B[31m"),
        GREEN("\u001B[32m"), YELLOW("\u001B[33m"),
        BLUE("\u001B[34m"), PURPLE("\u001B[35m"),
        CYAN("\u001B[36m"), WHITE("\u001B[37m");
        
        final private String code;
        
        private Color(String code) {
        	this.code = code;
        }
        
        public String getCode() {
        	return code;
        }
    };
    
    private Color color;
    
    Public ColorCommand(Color color) {
    	thus.color = color;
    }
    
    @Override
    public void run() {
        System.out.print(color.getcode());
    }
}

CommandGroup 클래스 command객체를 저장 후 모아서 실행함.

public class CommandGroup implement Command {
    private ArrayList<Command> commands = new ArrayList<>();
    
    public void add(Command command) {
        commands.add(command);
    }
    
    @Override
    pubilc void run() {
        for(Command command : commands) {
        	command.run();
        }
    }

}

지금까지 작성한 클래스로 최종 구현.

예시는 배치 실행으로 해서 CommandGroup에 각 Command를 저장 후 순차적으로 실행하게 됨.

public class MainEntry {

    public static void main(String[] args) {
    	CommandGroup = cmdGroup = new CommanGroup();
        
        Command clearCmd = new ClearCommand();
        cmdGroup.add(clearCmd);
        
        Command yellowColorCmd = new ColorCommand(ColorCommand.Color.YELLOW);
        cmdGroup.add(yellowColorCmd);
        
        cmdGroup.run();
    }
}

 

'코딩 > Software Architecture' 카테고리의 다른 글

[GoF Design Pattern] Facade  (0) 2022.12.04
[GoF Design Pattern] Flyweight  (0) 2022.12.04
[GoF Design Pattern] Prototype  (0) 2022.12.03
[GoF Design Pattern] Proxy  (0) 2022.12.02
[GoF Design Pattern] Factory Method, Observer  (0) 2022.12.01