RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'커맨드 패턴'에 해당되는 글 1
2007/11/12  커맨드 패턴 요약  
이전 블로그의 글을 옮겼습니다.


  • 정의
    • 요청 내역을 객체로 캡슐화하여 클라이언트를 서로다른 요청내역에 따라 매개변수화 할 수 있다.
    • 요청을 큐에 저장하거나 로그로 기록할 수도 있고, 작업취소 기능을 지원할 수도 있다.
  • 특정 객체를 인스턴스화하여 바로 사용하는것이 아니라, 미리 약속된 인터페이스로 한번 감싸서(캡슐화) 해당 인터페이스를 통해 객체를 사용하는 패턴
  • 객체를 한번더 캡슐화하여 사용하게 되면 각기다른 객체들을 실행하게 되는데 서로 동일한 인터페이스를 사용할 수 있음으로써 객체를 사용하는데 일관성을 가질 수 있게 된다.
  • 또한 특정 인터페이스를 구현하여 실행에 필요한 메서드만을 노출 시킴으로써 객체를 캡슐화하여 보호 할 수 있다.
  • 인터페이스 내부에서 실행에 관련 여러가지 특별처리(?)를 수행 할 수있다.
    • 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클래스에서 직접 사용하였다.

=> 위 코드들의 내용을 다시한번 클래스화하여 사용할 수 있도록 만들면 그것이 바로 인보커 클래스. (예로든 코드에서는 귀찮아-_-서 이렇게 구현하였지만 실제 사용에서는 인보커를 구현하는것이 좋다)


2007/11/12 19:19 2007/11/12 19:19
http://lemonwidz.com/tc/trackback/12
전체 (23)
사진이야기 (4)
프로그래밍 (18)
  1. Nyaonge's Home  2011
    [C#] ?? 연산자(물음표 두개)
  1. 2012/03 (1)
  2. 2011/12 (2)
  3. 2009/07 (1)
  4. 2009/04 (1)
  5. 2009/03 (9)