Command 패턴 (명령 패턴)


> 특징

· '행위패턴' 중 하나로, 요청(명령)을 객체의 형태로 '캡슐화'하여 사용자가 보낸 요청을 나중에 이용.

· 메소드명, 매개변수 등 요청(명령)에 필요한 정보를 저장 또는 로깅 할 수 있는 패턴.

· 요청을 처리할 작업을 일반화 시켜 요청의 종류와는 무관하게 프로그램 작성이 가능.




> 패턴 구성자


1. Command(명령)

· 발동자 객체제 전달되어 명령을 발동.

2. Receiver(수신자)

· 자신에게 정의된 메소드를 수행.

3. Invoker(발동자)

· 한 발동자에 다수의 커맨드 객체가 전달될 수 있다. 필요에 따라 명령 발동에 대한 기록을 남긴다.

4. Client(사용자)

· 발동자 객체와 하나 이상의 커맨드 객체를 보유한다.





> 다이어그램


 invoker





[예]

> 게임 속 행동 구현 코드

· 객체 내에 명령이 캡슐화 되어 사용자 입장에서는 execute() 만 실행하면 된다. 


using System.Collections;
public class Command {

public virtual void Execute(){}

}

public class CommandFire : Command {
public override void Execute()

{
Fire();
}

void Fire()

{
Debug.Log("Fire");
}

}

public class CommandJump : Command {
public override void Execute()

{
Jump();
}

void Jump()

{

Debug.Log("Jump");

}

}

public class CommandRoll : Command {
public override void Execute()

{

Roll();
}

void Roll()

{

Debug.Log("Roll");

}
}

public class CommandSkill : Command {
public override void Execute()

{

Skill();

}

void Skill()

{

Debug.Log("Skill");

}

}


[참고]

https://ko.wikipedia.org/wiki/%EC%B1%85%EC%9E%84_%EC%97%B0%EC%87%84_%ED%8C%A8%ED%84%B4

http://rapapa.net/?p=3143

'Design Pattern' 카테고리의 다른 글

Chain of Responsibility 패턴  (0) 2018.02.05

Chain of Responsibility (책임 연쇄 패턴)


> 특징

· 각각의 처리객체들이 명령객체들을 처리하는 연산 집합. 책임을 떠넘긴다.

· 체인 안의 처리객체가 핸들 하지 못하는 경우 다음 객체로 넘긴다. 체인 끝까지 반복.

· 복수의 객체를 chain으로 연결해 두면, 그 객체의 사슬을 차례로 돌아다니면서 목적한 객체를 결정하는 방법이다. 

사슬의 순서는 동적으로 변경 가능하다.

· 요구를 하는 사람(Client)와 요구를 처리하는 사람(ConcreteHandler)을 유연하게 연결.

· '이 요구는 이 사람이 처리해야 한다' 라는 정보를 중앙집권적으로 가지고 있지 않게 한다. 

· 요구를 하는 사람이 처리자들의 역할 분담까지 자세하게 알 필요가 없음.




> 패턴 구성자


1. Handler(처리자)

· 요구를 처리하는 API결정. 다음 처리객체를 가르키는 Next 변수 선언, setNext() 메소드구현. 

2. ConcreteHandler(구체적인 처리자)

· 각 요구에 대한 구체적인 처리 방법 명시, 구체화.

3. Client(요구자)





> 다이어그램


 





[예]

- 로그를 생성하는 로그 핸들러


1. 추상클래스(Handler)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
abstract class Logger {
    public static int ERR = 3;
    public static int NOTICE = 5;
    public static int DEBUG = 7;
    protected int mask;
 
    // The next element in the chain of responsibility
    protected Logger next;
 
    public Logger setNext(Logger log) {
        next = log;
        return log;
    }
 
    public void message(String msg, int priority) {
        if (priority <= mask) {
            writeMessage(msg);
        }
        if (next != null) {
            next.message(msg, priority);
        }
    }
 
    abstract protected void writeMessage(String msg);
}
cs


2. stdoutLogger(concreteHandler)


1
2
3
4
5
6
7
8
9
class StdoutLogger extends Logger {
    public StdoutLogger(int mask) {
        this.mask = mask;
    }
 
    protected void writeMessage(String msg) {
        System.out.println("Writing to stdout: " + msg);
    }
}
cs

3. stderrLogger(concreteHandler)

1
2
3
4
5
6
7
8
9
class StderrLogger extends Logger {
    public StderrLogger(int mask) {
        this.mask = mask;
    }
 
    protected void writeMessage(String msg) {
        System.err.println("Sending to stderr: " + msg);
    }
}
cs


4. Client main()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ChainOfResponsibilityExample {
    public static void main(String[] args) {
        
        Logger logger, logger1;
        logger1 = logger = new StdoutLogger(Logger.DEBUG);
// 체인 연결
        logger1 = logger1.setNext(new EmailLogger(Logger.NOTICE));
        logger1 = logger1.setNext(new StderrLogger(Logger.ERR));
 
        // Handled by StdoutLogger
        logger.message("Entering function y.", Logger.DEBUG);
 
        // Handled by StdoutLogger and EmailLogger
        logger.message("Step1 completed.", Logger.NOTICE);
 
        // Handled by all three loggers
        logger.message("An error has occurred.", Logger.ERR);
    }
}

cs



[참고]

https://ko.wikipedia.org/wiki/%EC%B1%85%EC%9E%84_%EC%97%B0%EC%87%84_%ED%8C%A8%ED%84%B4

'Design Pattern' 카테고리의 다른 글

Command 패턴  (0) 2018.02.08

+ Recent posts