본문 바로가기

Software Architect

[Design Pattern] Command / Strategy / State Pattern

Command Pattern

개요 

  • 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴
  • 커맨드를 수행할 수 있도록 하는 패턴

 

구현 방법

public class main {
	public static void show(Box box) {
		for (int i = 0; i < 10; i++) {
			if (box.getX() == i) System.out.print("#");
			else System.out.print("_");
		}
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		Box box = new Box();
		Command cmdRight = new Right(box); 
		Command cmdLeft  = new Left (box);
		
		while (true) {
			System.out.print("\nInput Command : ");
			String cmd = sc.next();
			if (cmd.equals("left" )) cmdLeft .run();
			if (cmd.equals("right")) cmdRight.run();
			show(box);
		}		
	}
}


class Box {
	private int x = 5;
	
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
}

interface Command {
	void run();
}
class Left implements Command {
	Box box;
	public Left(Box box) {
		this.box = box;
	}
	@Override
	public void run() {
		box.setX(box.getX()-1);
	}
}
class Right implements Command {
	Box box;
	public Right(Box box) {
		this.box = box;
	}
	@Override
	public void run() {
		box.setX(box.getX()+1);
	}
}
  • Command를 Class로 만들어서 사용

 


Strategy Pattern

개요

  • 실행 중에 알고리즘을 선택할 수 있는 행위 디자인 패턴

 

구현 방법

import java.util.Scanner;
import java.util.ArrayList;

public class main {
	public static void main(String[] args) {
		Strategy st = null;
		Scanner sc = new Scanner(System.in);
		
		System.out.println("Input two num ?");
		int a = sc.nextInt();
		int b = sc.nextInt();
		
		System.out.println("Algorithm : ");
		System.out.println("1. Using GPU");
		System.out.println("2. Using CPU");
		int n = sc.nextInt();
		
		System.out.println("Results =========");
		if (n==1) st = new GPU();
		if (n==2) st = new CPU();
		int c = st.sum(a, b);
		System.out.println(c);
	}
}

interface Strategy {
	int sum(int a, int b);
}
class CPU implements Strategy {
	@Override
	public int sum(int a, int b) {
		// CPU Algorithm
		return a+b;
	}
}
class GPU implements Strategy {
	@Override
	public int sum(int a, int b) {
		// CPU Algorithm
		return a+b;
	}
}

 


State Pattern

개요

  • 상태값을 저장하는 패턴 -> State Machine 개발시 이용

 

구현 방법

public class main {
	public static void main(String[] args) {
		Arbiter stateMachine = new Arbiter(new IdleState());
		for (int i = 0; i< 10; i++) {
			stateMachine.runState();
		}
	}
}

class Arbiter {                               // [1]
	State nextState;
	Arbiter(State startState) {
		nextState = startState;
	}
	public void setState(State state) {
		nextState = state;
	}
	void runState () {
		nextState.run(this);
	}
}

interface State {                            // [2]
	void run(Arbiter arbiter);
}

class IdleState implements State {           // [3]
	@Override
	public void run(Arbiter arbiter) {
		System.out.println("[IDLE] Waiting");
		System.out.println("[IDLE] Send condition");
		send(arbiter);
	}
	
	private void send(Arbiter arbiter) {
		System.out.println("[IDLE] Prepare Send");
		arbiter.nextState = new SendState();
	}
}

class SendState implements State {
	@Override
	public void run(Arbiter arbiter) {
		System.out.println("[SEND] Sending");
		System.out.println("[SEND] Sending complete");
		arbiter.nextState = new FinishState();
	}
}

class FinishState implements State {
	@Override
	public void run(Arbiter arbiter) {
		System.out.println("[FINISH] Finishing");
		System.out.println("[FINISH] Finishing complete");
		arbiter.nextState = new IdleState();
	}
}
  • [1] State 관리 객체 -> 실제로 실행 시켜 주는 역할 / nextState가 어떤 것인지를 지정
  • [2] 상태 저장용 interface
  • [3] 상태 클래스 
    : run method -> 상태가 변경되었을 때 수행해야 하는 부분

 


패턴 비교

Command / State / Strategy Pattern 비교

Command Pattern Strategy Pattern State Pattern
Command를 객체로 생성 적용할 알고리즘을 객체로 생성 각각의 상태를 객체로 생성

 

'Software Architect' 카테고리의 다른 글

[Sofrware Architecture] SA 개요  (0) 2022.03.28
[Software Architecture] SW 공학  (0) 2022.03.28
[Design Pattern] Flyweight pattern  (0) 2022.03.25
[Design Pattern] Observer Pattern  (0) 2022.03.25
[Design Pattern] Decorator Pattern  (0) 2022.03.24