2021.11.17 TIL

pbg0205·2021년 11월 17일
0

TIL

목록 보기
13/13

커맨드 패턴

어제 이해하지 못했던 커맨드 패턴에 대해 자바 객체지향 디자인 패턴을 통해 학습했다.


1. 커맨드 패턴?

커맨드 패턴은 실행할 기능을 캡슐화하는 패턴이다. 캡슐화(capsulation)은 객체의 속성과 행위를 묶고 그와 관련된 세부 정보를 외부에 노출하지 않는다는 의미이다. 각 역할이 갖는 기능은 아래와 같다.

  • Invoker : 기능의 실행을 요청 호출자 클래스
  • Command : 실행될 기능에 대한 인터페이스, 실행될 기능을 메서드로 선언한다.
  • ConcreteCommand : 실제 실행한 기능을 구현하는 클래스
  • Receiver : ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스

2. 커맨드 패턴의 사용의 시그널

커맨드 패턴 사용의 시그널은 switch로 행위를 분기시켜 다른 로직을 처리할 경우, 커맨드 패턴의 사용한다.

enum Mode {LAMP, ALARM}

class Button {
	
    public void pressed(Mode mode) {
    
    	switch(mode) {
        	
            case LAMP :
            	lamp.turnOn();
                break;
            
            case ALARM :
            	alarm.start();
                break;
        }
    
    }
}

이 코드에서 기능을 추가될 경우, 분기문들이 증가해 pressed() 크기는 비대해 질 것이다. Button 클래스에 새로운 기능을 추가할 때마다 코드를 수정할 경우, Button 클래스의 재사용은 어렵다. 이를 해결하기 위해서는 커맨드 패턴을 사용해야 한다.


3. 커맨드 패턴 예시


class Button {
	
    private Command command;
    
    public void pressed() {
    	command.execute();
    }
}


interface Command {void execute();}


class LampCommand implements LampCommand {
	
    private Lamp lamp;
    
    public void execute() {
    	lamp.turnOn();
    }
}

class AlarmCommand implments AlarmCommand {
	
    private Alarm alarm;
    
    public void execute() {
    	alarm.start();
    }
}


class Alarm {
	
    public void start() {
    	System.out.println("알람 울림");
    }
}


class Lamp {
	
    public void turnOn() {
    	System.out.println("램프 켜짐");
    }
}

4. 커맨드 패턴의 장점

커맨드 패턴이 장점은 실행 기능을 캡슐화하여 기능 실행을 요구하는 호출자(invoker) 클래스와 실제 기능을 실행하는 수신자(receiver) 사이의 의존성을 제거한다. 따라서 실행될 기능의 변경에도 호출자 클래스를 수정없이 그대로 사용할 수 있도록 한다. 변경과 수정없이 기능에 확장에 열려있다는 측면은 OCP를 만족하는 부가적인 장점이 존재한다.

profile
🧑‍💻 steady developer

0개의 댓글