디자인패턴 Command Pattern

커맨드 패턴은 요구사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있습니다.

또한 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능합니다.

 

커맨드 패턴은 실제로 어떻게 적용할까요?

커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화한 것입니다.

리시버를 한 객체에 넣어주고, 실행시키기 위한 메서드 하나만 외부에 공개하는 방법을 사용합니다.

이 메소드 호출에 의해 리시버에서 일련의 작업이 처리됩니다.

외부에서는 어떤 객체가 리시버 역할을 하는지 모르고 실제로 어떤 일을 하는지 알 수 없습니다.

실행을 위한 메서드만 호출하면 요구 사항이 처리된다는 것만 알 수 있습니다.

 

Command

package cg.park.designpattern.command;

public interface Command {
    public void execute();
}

 

 

Light ON/OFF

불을 켜고 끄는 Light ON과 Light OFF 라는 기능이 있습니다.

사용자 입장에서는 버튼만 누르면 기능은 실행됩니다.

사용자는 버튼을 눌렀을 때 내부적으로 어떤 일이 일어나는지 모릅니다.

이렇게 요청 내역을 객체로 캡슐화하고, 클라이언트는 버튼 하나로 기능을 제공받을 수 있습니다.

 

구현

Command

package cg.park.designpattern.command;

public interface Command {
    public void execute();
}

 

Light

package cg.park.designpattern.command;

public class Light {

    public Light() {}

    public void on() {System.out.println("Light: ON");}

    public void off() {System.out.println("Light: OFF");}

}

 

LightOff

package cg.park.designpattern.command;

public class LightOff implements Command {
    Light light;

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

    public void execute() {
        light.off();
    }
}

 

LightOn

package cg.park.designpattern.command;

public class LightOn implements Command {
    Light light;

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

    public void execute() {
        light.on();
    }
}

 

RemoteControl

package cg.park.designpattern.command;

public class RemoteControl {

    public static void main(String[] args) {
        Light light = new Light();
        LightOn lightOn = new LightOn(light);
        LightOff lightOff = new LightOff(light);

        lightOn.execute();//ON
        lightOff.execute();//OFF
    }

}

위의 main 클래스에서 execute를 사용하면 LightON, LightOFF가 실행됩니다.

 

후기

처음에는 Facade Pattern과 뭐가 다른지 궁금했었는데, 직접 자료를 찾아보고 구현해보면서 알게되었습니다.
감사합니다.

퍼사드 패턴 보러가기

 

Git: https://github.com/qkrcksrbs8/designpattern

참조 자료: Head First Design Patterns

+ Recent posts