일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 |
Tags
- redis
- Java
- 알고리즘
- C
- mongoDB
- 네트워크
- Spring
- 운영체제
- 백준
- MySQL
- react
- Data Structure
- 디자인 패턴
- 컴퓨터구조
- Kafka
- Galera Cluster
- JavaScript
- Algorithm
- design pattern
- c언어
- spring webflux
- 자료구조
- MSA
- Proxy
- 자바
- OS
- JPA
- Heap
- 파이썬
- IT
Archives
- Today
- Total
시냅스
State Pattern - java로 구현 본문
스테이트 패턴 State Pattern
- 클래스가 하나의 상태에 따라 그 내부의 여러 메서드의 기능이 바뀐다고 하면 이를 각각의 클래스로 분리한다.
의도와 동기
- 객체의 기능은 상태에 따라 달라질 수 있는데, 이러한 상태가 여러가지이고, 클래스 전반의 모든 기능이 상태에 의존적이라 하면, 상태를 클래스로 표현하는 것이 적절함
- 클래스로 분리하지 않게 되면 상태가 여러가지인 경우 많은 if-else 문이 사용되고 추후 상태가 추가되거나 삭제될 때 수정해야 하는 사항이 너무 많아짐
- Context : ConcreteState의 인스턴스를 관리하고 서로 상태가 바뀌는 순간을 구현할 수 있다.
- State : Context 가 사용할 메서드를 선언한다.
- ConcreateState : 각 상태 클래스가 수행할 State에 선언된 메서드를 구현한다.
결론
- 상태에 따른 기능을 분리하여 구현
- 새로운 상태가 추가되면 새로운 클래스를 추가한다.
- 각 상태의 switch를 명확하게 구현해 함
구현
package statepattern;
interface PlayerLevel {
public void run();
public void jump();
public void turn();
public void showLevelMessage();
}
class Beginner implements PlayerLevel {
@Override
public void run() {
System.out.println("천천히 달립니다..");
}
@Override
public void jump() {
System.out.println("Jump 할 줄 모르지롱.");
}
@Override
public void turn() {
System.out.println("turn 할 줄 모르지롱");
}
@Override
public void showLevelMessage() {
System.out.println("Beginner");
}
}
class Advanced implements PlayerLevel {
@Override
public void run() {
System.out.println("빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("높이 Jump 합니다.");
}
@Override
public void turn() {
System.out.println("turn 할 줄 모르지롱");
}
@Override
public void showLevelMessage() {
System.out.println("Advanced");
}
}
class Super implements PlayerLevel {
@Override
public void run() {
System.out.println("아주 빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("아주 높이 jump 합니다.");
}
@Override
public void turn() {
System.out.println("한 바퀴 돕니다..");
}
@Override
public void showLevelMessage() {
System.out.println("Super");
}
}
class Player {
PlayerLevel pl;
public Player() {
this.pl = new Beginner();
}
public void play(int time) {
pl.run();
for (int i = 0; i < time; i++) {
pl.jump();
}
pl.turn();
}
public void upgradeLevel(int level) {
if (level == 1)
return ;
else if (level == 2)
this.pl = new Advanced();
else if (level == 3)
this.pl = new Super();
}
}
public class StatePattern {
public static void main(String[] args) {
Player player = new Player();
player.play(1);
System.out.println();
player.upgradeLevel(2);
player.play(2);
System.out.println();
player.upgradeLevel(3);
player.play(3);
}
}
'디자인 패턴' 카테고리의 다른 글
템플릿 메소드 패턴 Java로 구현 (0) | 2022.08.17 |
---|---|
전략 패턴 Strategy Pattern - Java로 구현 (0) | 2022.08.02 |
데코레이터 패턴, Decorator Pattern Java로 구현 (0) | 2022.07.25 |
팩토리 메소드 패턴 Java로 구현 (0) | 2022.07.25 |
싱글톤 패턴 singleton pattern Java로 구현 (0) | 2022.07.25 |
Comments