Command pattern 김우진
-
Upload
woo-jin-kim -
Category
Software
-
view
529 -
download
1
Transcript of Command pattern 김우진
Command Pattern
NHN NEXT 김우진
요구사항을 객체로 캡슐화 하는 패턴.
!
시작
다음과 같은 리모콘의 S/W제작을 의뢰 받았습니다.
에어컨TV
오디오현관문거실 등
기능은 간단합니다.
에어컨TV
오디오현관문거실 등
1. 휠을 통한 가전제품 선택 2. 버튼을 통한 On/Off
먼저, 가전제품과 직접적으로 연결하기로 합니다.
에어컨TV
오디오현관문거실 등
public void airconButtonClick(Aircon aircon) { if(aircon.isOn()) { aircon.off(); } else { aircon.on(); }}
먼저, 가전제품과 직접적으로 연결하기로 합니다.
에어컨TV
오디오현관문거실 등
public void audioButtonClick(Audio audio) { if(audio.isPlay()) { audio.stop(); } else { audio.play(); }}
하다보니까…
TV오디오현관문거실등???
public void ???ButtonClick(??? ???) { if(???()) { ???(); } else { ???(); }}
가전제품마다 메소드가 달라, 새로운 기능이 추가되면,
매번 추가해 주어야 합니다.
!
그래서…
하나의 메소드로, 여러 가전제품을 조작 할 수 없을까?
remote.buttonClick();remote.tvButtonClick();remote.audioButtonClick();remote.???ButtonClick();
!
그래서 Command Pattern!
요구사항을 객체로 캡슐화합니다.
public interface Command { public void execute();}
먼저, 가전제품 별로 Command객체를 구현합니다.
에어컨TV
오디오현관문거실 등
public class AirconCommand implements Command { Aircon aircon; public airconCommand (Aircon aircon) { this.aircon = aircon; }! @Override public void execute() { if(aircon.isOn()) { aircon.off(); } else { aircon.on(); } }}
다시 기능을 볼까요?
에어컨TV
오디오현관문거실 등
1. 휠을 통한 가전제품 선택 !
!
2. 버튼을 통한 On/Off
Command객체를 Remote객체에 넘깁니다.
Remote객체에서 buttonClicked메소드를 실행합니다.remote.buttonClick();
remote.setCommand(command);
Command객체를 Remote객체에 넘깁니다.(선택)
// In main method// 객체 생성Remote remote = new Remote();Aircon aircon = new Aircon();AirconCommand ac = new AirconCommand(aircon);!// Command 객체 넘기기 remote.setCommand(ac);
buttonClicked메소드를 실행합니다.(on/off)
// 버튼 누르기remote.buttonClick();
다른 가전제품을 조작하려면?
// 객체 생성tvCommand tc = new AirconCommand(tv);!// Command 객체 넘기기 remote.setCommand(tc);!// 버튼 누르기remote.buttonClick();
참고 : Remote Class
public class remoteTest { Command slot; public void setCommand(Command command) { slot = command; } public void buttonClick() { slot.execute(); }}
이제 새로운 제품이 추가되면, Command Interface를 구현하기만 하면 됩니다.
참 쉽죠?
Class Diagram
리모콘
사용자
가전제품
!
Memento Pattern 복습
Memento Pattern 이것만 알면 된다!
1. 상태를 객체에 담아 저장한다.
Memento Pattern 이것만 알면 된다!
2. 상태객체를 통해 이전 상태로 돌아 갈 수 있다.
Memento Pattern 이것만 알면 된다!
3. 상태객체를 생성하는 곳과 저장하고 관리하는 곳이 다르다.
Memento Pattern Class Diagram
상태객체생성, 변경 저장, 관리
!
Command Pattern + Memento Pattern
Command Pattern + Memento Pattern
public interface Command { public void execute(); public void undo();}
먼저 execute()에 반대되는 undo()를 구현한다. ex) excute() - on() : undo() - off()
Command Pattern + Memento Pattern
Main Method에서 List에 Command객체를 저장한다.
List<Command> commandList = new ArrayList<Command>();commandList.add(ac);
Command Pattern + Memento Pattern
List에서 pop()하여 undo()를 실행하면, 이전상태로 돌아간다.
commandList.pop().undo();
Command Pattern + Memento Pattern
여기서 Command Object를 상태를 저장하는 하나의 Memento라고 볼 수 있다.
!
마지막으로
Command Pattern 이것만 기억하자!
Command Pattern은 요구사항을 객체화 하여,
Client의 코드와 Receiver의 코드를 분리하는 Pattern 이다.
Client (사용자)
Receiver (가전제품)
Invoker (리모콘)
Command 객체 사용
!
끝, Q & A
참고
Head First Design Patterns - O’REILLY
WIKIPEDIA