본문 바로가기
  • Where there is a will there is a way.
개발/java

커맨드 패턴

by 소확행개발자 2019. 6. 30.

커맨드 패턴

 

호출 캡슐화 : 한차원 높은 단계의 캡슐화

 

메소드 호출을 캡슐화하는 것이다. 메소드 호출을 캡슐화 하는 것이다.

 

 

흔히 식당으로 생각해보자

 

고객과 웨이트리스 , 그리고 주문과 주방장 사이의 관계에 대하서 생각을 해보면 

 

커맨드 패턴에서 각 객체들 사이의 관계를 이해할  수 있을 것이다.

 

1. 고객이 웨이트리스한테 주문을 한다.

2. 웨이터는 주문을 받아서 카운터에 갖다 주고 주분 받아요 이야기를 한다.

3. 주방장이 주문대로 음식을 준비한다.

 

 

1  -> createOrder()

2 -> takeOrder()

3 -> orderUp()

4 -> makeBurger(), makeSake()

 

flow

주문서는 주문한 메뉴를 요구하는 역할을 하는 객체로 생각할 수 있다.

다른 객체와 마찬가지로 여기저기로 전달 될 수 있다.

 

웨이터는 주문서를 받아서 거기에 있는 orderUp() 메소드를 호출한다.

 

주방장은 식사를 준비하는 데 필요한 정보를 가지고 있다.

 

 

package commandpattern.model;

public class Light {

    public void on(){
        System.out.println("불을 켜다");
    }

    public void off(){
        System.out.println("불을 끄다");
    }

}
public interface Command {

    void execute();

}
 

 

public class LightCommand implements Command {

    Light light;

    public LightCommand(Light light){
        this.light = light;
    }

    @Override
    public void execute() {
        this.light.on();
    }
}
public class SimpleRemoteControl {

    Command slot;

    public void setCommand(Command command){
        slot = command;
    }

    public void buttonWasPressed(){
        slot.execute();
    }

}
public class Main {

    public static void main(String[] args) {

        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightCommand lightCommand = new LightCommand(light);

        remote.setCommand(lightCommand);
        remote.buttonWasPressed();


    }
}

 

커맨드 패턴의 활용

 

어떤 요청등을 --> 커맨드로 분리되어 있기 때문에 커맨드를 갈아끼워서 사용가능하다.

 

하나의 스레드에서 ( 하나의 요청 ) 컴퓨팅 작업을 하다가 다른 요리의 주문을 하다가 다른 요리를 받아서 할 수 있다.

 

하나의 리모트 컨트롤러에 여러개의 커맨드를 담을 경우에 

 

커맨드를 중간까지 하다가 롤백이 되거나 문제가 생긴 경우에 리모트 컨트롤러에 로그를 달아 놓아서 어디서 실패했는지 확인 할 수도 있고

 

멈춘 지점부터 다시 진행되게 할 수도 있다.

 

 

----------

 

객체지향 원칙

 

1. 바뀌는 부분은 캡슐화 한다.

 

2. 상속보다는 구성을 활용한다.

 

3. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

 

4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.

 

5. 클래스는 확장에 대해서는 열려있지만 변경에 대해서는 닫혀 있어야 한다.

 

6. 추상화된 것에 의존하라. 구상 클래스에 의존하지 않도록 한다.

'개발 > java' 카테고리의 다른 글

템플릿 메소드 패턴  (2) 2019.07.04
어댑터 패턴  (0) 2019.07.01
자바 날짜계산 유틸리티 구현  (0) 2019.02.19
java Ramda 리스트 컬랙션 데이터 예제  (0) 2019.01.30
java 메모리 영역  (0) 2019.01.14

댓글