프로그래밍/디자인 패턴 2007/11/12 19:19
이전 블로그의 글을 옮겼습니다.
- 정의
- 요청 내역을 객체로 캡슐화하여 클라이언트를 서로다른 요청내역에 따라 매개변수화 할 수 있다.
- 요청을 큐에 저장하거나 로그로 기록할 수도 있고, 작업취소 기능을 지원할 수도 있다.
- 특정 객체를 인스턴스화하여 바로 사용하는것이 아니라, 미리 약속된 인터페이스로 한번 감싸서(캡슐화) 해당 인터페이스를 통해 객체를 사용하는 패턴
- 객체를 한번더 캡슐화하여 사용하게 되면 각기다른 객체들을 실행하게 되는데 서로 동일한 인터페이스를 사용할 수 있음으로써 객체를 사용하는데 일관성을 가질 수 있게 된다.
- 또한 특정 인터페이스를 구현하여 실행에 필요한 메서드만을 노출 시킴으로써 객체를 캡슐화하여 보호 할 수 있다.
- 인터페이스 내부에서 실행에 관련 여러가지 특별처리(?)를 수행 할 수있다.
- undo기능이 대표적이며, 실행순서를 기록할 수 있도록 구현하면 undo기능을 다중으로 처리할 수도 있고, 한번에 기록을 다시 실행시키는 매크로 기능도 구현할 수 있다.
- 샘플 코드
namespace Chapter06_CommandPattern
{
interface Command
{
void execute();
void undo();
}
}
=> 커맨드 패턴을 구현하기 위한 인터페이스. 이 인터페이스를 구현함으로써 제각각(?)의 클래스들을 하나의(여기서는 execute())메서드를 통해 실행 시킬 수 있다.
using System;
namespace Chapter06_CommandPattern
{
class Audio
{
public Audio()
{
}
public void On()
{
Console.WriteLine("Turn On");
}
public void Off()
{
Console.WriteLine("Turn Off");
}
}
}
=> 실제 기능을 담당하는 클래스. 리시버(receiver)라고 부름.
namespace Chapter06_CommandPattern
{
class TurnOn : Command
{
Audio audio;
public TurnOn(Audio audio)
{
this.audio = audio;
}
public void execute()
{
audio.On();
}
public void undo()
{
audio.Off();
}
}
}
=> 인터페이스를 구현하여 리시버를 하나의 행동양식으로 표현할 수 있도록 해줌.
namespace Chapter06_CommandPattern
{
class TurnOff : Command
{
Audio audio;
public TurnOff(Audio audio)
{
this.audio = audio;
}
public void execute()
{
audio.Off();
}
public void undo()
{
audio.On();
}
}
}
=> 위의 TurnOn 클래스와 동일
using System;
using System.Collections.Generic;
using System.Text;
namespace Chapter06_CommandPattern
{
class Program
{
static void Main(string[] args)
{
Audio audio = new Audio();
TurnOn audioTurnOn = new TurnOn(audio);
TurnOff audioTurnOff = new TurnOff(audio);
Command cmd = audioTurnOn;
cmd.execute();
cmd.undo();
cmd = audioTurnOff;
cmd.execute();
cmd.undo();
Console.ReadLine();
}
}
}
=> 위에서 구현한 코드들을 바탕으로 실행한 예. 리시버 객체를 하나만 생성하여 행동을 구현한 클래스에 넘겨주는것에 포인트가 있음.
=> 여기서는 인보커를 별도로 구현하지 않고 Program클래스에서 직접 사용하였다.
=> 위 코드들의 내용을 다시한번 클래스화하여 사용할 수 있도록 만들면 그것이 바로 인보커 클래스. (예로든 코드에서는 귀찮아-_-서 이렇게 구현하였지만 실제 사용에서는 인보커를 구현하는것이 좋다)
http://lemonwidz.com/tc/trackback/12


0