본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

State 패턴

상태를 클래스로 만들어 관리하는 패턴


1. 코드 

MaterialState : 상태 클래스들의 인터페이스

public interface MaterialState {
	
	void speakState();
	void speakFeature();
}

 

MaterialState1 : 상태 클래스1

public class MaterialState1 implements MaterialState {
	
	private static MaterialState1 instance = new MaterialState1();
	
	private MaterialState1() {
	}
	
	public static MaterialState1 getInstance() {
		return instance;
	}

	@Override
	public void speakState() {
		System.out.println("상태1 입니다.");
	}

	@Override
	public void speakFeature() {
		System.out.println("특징1 입니다.");
	}
}

 

MaterialState2 : 상태 클래스2

public class MaterialState2 implements MaterialState {

	private static MaterialState2 instance = new MaterialState2();
	
	private MaterialState2() {
	}
	
	public static MaterialState2 getInstance() {
		return instance;
	}

	@Override
	public void speakState() {
		System.out.println("상태2 입니다.");
	}

	@Override
	public void speakFeature() {
		System.out.println("특징2 입니다.");
	}
}

 

Material : 상태 클래스를 사용하기 위한 클래스

public class Material {

	private MaterialState state;
	
	public void setState(int num) {
		if (num % 2 == 0) {
			state = MaterialState1.getInstance();
		} else {
			state = MaterialState2.getInstance();
		}
	}
	
	public void speakState() {
		state.speakState();
	}
	
	public void speakFeture() {
		state.speakFeature();
	}
}

 

Main: 테스트 클래스

public class Main {

	public static void main(String[] args) {

		Material material = new Material();
		Random random = new Random();
		
		for (int i = 0; i < 10; i++) {
			
			material.setState(random.nextInt());
			material.speakState();
			material.speakFeture();
		}
	}
}

 

 

 

2. 특징

- 언제 어떤 상태가 되어야 하는지 관리가 쉽다.

- 새로운 상태를 생기면 상태 클래스를 추가하기만 하면 된다.

    - 또한 상태에 따른 행동이 인터페이스에 기재되어 있으므로 누락되는 오류를 막을 수 있다.

- 상태들이 서로 독립적이다.

- Material클래스만 잘 관리하면 두 상태가 공존하는 오류를 막기 쉽다.

 

3. 해당 패턴을 고려해볼만한 상황

- 상태에 따른 로직 관리가 필요할 때

'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글

Memento 패턴  (0) 2021.03.08
Observer 패턴  (0) 2021.02.21
Mediator 패턴  (0) 2021.02.14
Facade 패턴  (0) 2021.02.12
Chain Of Responsibility 패턴  (0) 2021.02.11