커맨드패턴(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
'JAVA' 카테고리의 다른 글
Java - 싱글톤 패턴(Singleton Pattern) (0) | 2022.03.10 |
---|---|
Java - Checked Exception VS Unchecked Exception (0) | 2022.03.10 |
Java - try-with-resources를 통한 자원해제방법 (0) | 2022.02.14 |
Java - 정규표현식 정리 (0) | 2022.02.07 |
Java - 자료구조와 컬렉션 프레임워크 (0) | 2022.01.23 |