본문 바로가기

JAVA

Java - 커맨드패턴(Command Pattern)

커맨드패턴(Command Pattern)이란?

: 객체의 행위(메소드)를 클래스로 만들어 캡슐화 하는 패턴. 커맨드패턴은 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계한다.

어떤 객체에서 다른 객체의 메소드를 실행하려면 참조를 하고 있어야 하는 의존성이 발생하는데, 이 의존성을 제거할 수 있다.

커맨드패턴 구현예제

public class Main {
    public static void main(String[] args) {
        // 채널변경
        Channel channel = new Channel();
        MyHome home = new MyHome();
        home.setCommand(new ChannelCommand(channel));
        home.touch1();
        home.touch2();

        // 음량변경
        Volume volume = new Volume();
        home.setCommand(new VolumeCommand(volume));
        home.touch1();
        home.touch2();
    }
}

/**
 * MyHome Class
 */
class MyHome {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void touch1() {
        command.touch1();
    }

    public void touch2() {
        command.touch2();
    }
}

/**
 * Command InterFace
 */
interface Command {
    public void touch1();
    public void touch2();
}

/**
 * 채널 변경
 */
class ChannelCommand implements Command {
    private Channel channel;

    public ChannelCommand(Channel channel) {
        this.channel = channel;
    }

    @Override
    public void touch1() {
        channel.channelUp();
    }

    @Override
    public void touch2() {
        channel.channelDown();
    }
}

class Channel {
    public void channelUp() {
        System.out.println("채널변경 +1");
    }

    public void channelDown() {
        System.out.println("채널변경 -1");
    }
}

/**
 * 음량 변경
 */
class VolumeCommand implements Command {
    private Volume volume;

    public VolumeCommand(Volume volume) {
        this.volume = volume;
    }

    @Override
    public void touch1() {
        volume.volumeUp();
    }

    @Override
    public void touch2() {
        volume.volumeDown();
    }
}

class Volume {
    public void volumeUp() {
        System.out.println("음량변경 +1");
    }

    public void volumeDown() {
        System.out.println("음량변경 -1");
    }
}

결과

채널변경 +1
채널변경 -1
음량변경 +1
음량변경 -1

 

Command 패턴을 사용하면 MyHome클래스를 변경하지 않으면서 다양한 동작을 구현할 수 있다. 처음에는 Channel만 변경할 수 있다가, Volume을 변경하는 기능이 필요하다고했을때, MyHome을 건드리지않고도 추가에 필요한 클래스를 정의하여 기능확장을 할 수 있다. 이렇게 시스템 확장에 좋으면서 유연해진다.

참고자료

= https://victorydntmd.tistory.com/295

= https://gmlwjd9405.github.io/2018/07/07/command-pattern.html