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

퀵소트(quicksort) 알고리즘


다양한 퀵소트 구현 방식이 존재 하지만, 아래의 방식이 가장 구현하기 쉽고 속도도 빠르다.


<사용법 >

quickSort(정렬할 배열, 배열 맨 왼쪽, 배열 맨 오른쪽)


<예시>

#define N 5

int arr[N] = {5,4,3,2,1};

quickSort(arr, 0, N-1);


<코드>

void swap(int &x, int &y) { 
    int temp = x; 
    x = y; 
    y = temp; 
}
 
void quickSort(int A[], int left, int right) { 
    int leftIndex = left, rightIndex = right;
    int pivot = A[(left + right) / 2];
    while (leftIndex <= rightIndex) {
 
        while (A[leftIndex] < pivot) leftIndex++;
        while (A[rightIndex] > pivot) rightIndex--;
 
        if (leftIndex <= rightIndex) {
            swap(A[leftIndex], A[rightIndex]);
            leftIndex++; rightIndex--;
        }
    }
 
    if (left < rightIndex) quickSort(A, left, rightIndex);
    if (right > leftIndex) quickSort(A, leftIndex, right);
}
cs



<STL 형태의 퀵소트 구현>

void _swap(void* a, void* b, int size) {
 
    void* temp = malloc(size);
 
    memcpy(temp, a, size);
 
    memcpy(a, b, size);
 
    memcpy(b, temp, size);
 
    free(temp);
 
}
 
 
 
int comepare(const void* a, const void* b) {
 
    if(((point*)a)->< ((point*)b)->x) return 1;
 
    else if (((point*)a)->> ((point*)b)->x) return -1;
 
    else return 0;
 
}
 
 
 
void quickSort(void* arr, int count, int sizeint (*cmp)(const void*const void*)) {
 
    int left = 0, right = count - 1;
 
    int leftIndex = 0, rightIndex = right, mid = (left + right) / 2;
 
    void* pivot = malloc(size);
 
    memcpy(pivot, (char*)arr + mid*sizesize);
 
 
 
    while (leftIndex <= rightIndex) {
 
        while (cmp((char*)arr + leftIndex*size, pivot) > 0) leftIndex++;
 
        while (cmp((char*)arr + rightIndex*size, pivot) < 0) rightIndex--;
 
        if (leftIndex <= rightIndex) {
 
            _swap((char*)arr + leftIndex*size, (char*)arr + rightIndex*sizesize);
 
                        leftIndex++; rightIndex--;
 
        }        
 
    }
 
    free(pivot);
 
 
    if (left < rightIndex) quickSort(arr, rightIndex, size, cmp);
 
    if (right > leftIndex) quickSort(arr, leftIndex, size, cmp);
 
}
cs


'Algorithm' 카테고리의 다른 글

유니온파인드  (0) 2020.06.28

IoT 서비스 SmartThings로 통합

통합 IoT 서비스인 스마트싱스(SmartThings)를 통해 모든 삼성IoT 플랫폼과 생태계를 연결.

삼성 커넥트 클라우드, 아틱 클라우드 를 스마트싱스 클라우드로 통합, 소비자들이 한 곳에서 모든 IoT 제품과 서비스를 제어할 수 있게 한다.

개발자들은 하나의 스마트싱스 클라우스 API를 이용해 솔루션 개발이 가능하다.


IoT 보안 시스템 모듈 및 솔루션 출시

기존 아틱 시리즈에 보안 성능을 한층 강화한 새로운 모듈 'ARTIKs-SoMs'(Secure System-on-Modules) 출시.

S/W와 H/W융합 IoT용 보안 솔루션 출시. 보안 IC에 소프트웨어를 융합한 턴키 솔루션(Turn-Key solution).


빅스비 2.0

미국 인공지능 플랫폼 기업 비브(Viv)의 기술을 통합한 빅스비 2.0 소개.

외부 서비스 제공자들이 자유롭게 참여하여 자신의 서비스를 비브(Viv)의 플랫폼에 연결할 수 있다.

빅스비 2.0을 통해 어느 제품에서나 사용할 수 있는 인공지능으로써 사용될 것.


VR 360도 카메라

기어 360 카메라와는 다르게 3D 콘텐츠와 가상현실(VR) 제작 및 생중계가 가능한 '삼성 360 라운드' 발표.



Intelligence of Things(IoT + A.I)

IoT와 인공지능이 결합된 새로운 소비자 사용 경험을 이끌어낸다. 사용자 주변의 다양한 사물이 IoT기기로써 서로 매끄럽게 연결 되며, 원하는 서비스를 직관적으로 명령하고 제공 받을 수 있다.



<본문>

[취재]

빅스비 2.0과 IoT 통합 서비스 제공
삼성전자 개발자 컨퍼런스 2017


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