반응형
상태 패턴이란?
- 객체가 어떤 상태에 따라 다른 행위를 해야 할 때 사용합니다.
- 상태를 객체화해서, 상태객체가 행동을 대신하도록 위임하는 패턴을 말합니다.
- 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않습니다.
- 스테이트 패턴은 코드내의 조건문들을 대체하려는 목적으로 사용됩니다.
상태 패턴을 사용하는 이유
패턴을 쓰지 않으면, 클래스에는 다음 요소들이 있을 것입니다.
- 상태를 담는 변수
- 상태를 결정하는 set 메소드
- 상태에 따라 행동하는 메소드 : switch문 또는 if else 체인
TV를 켜고 끄는 상황을 생각해봅니다.
- TV 전원이 켜진 상태에서 전원 버튼을 누르면, 전원을 끈다.
- TV 전원이 꺼진 상태에서 전원 버튼을 누르면, 전원을 켠다.
여기에 절전 상태가 추가되면 상태를 참조하는 메소드가 다 바뀌어야 합니다.
그리고 다른 클래스의 상태를 참조하는 메소드들도 다 바뀌어야 합니다.
사용법
- 스테이트 패턴을 적용하면 On/Off/Saving 상태를 클래스로 정의합니다.
- 이들을 하나의 인터페이스(타입)으로 묶습니다.
- Laptop이 상태 인터페이스의 메서드를 호출합니다.
- 각 상태 클래스에서 정의된 행위가 수행됩니다.
전원 상태 인터페이스
public interface PowerState {
public void powerPush();
}
인터페이스를 구현한 각 상태 클래스들
public class On implements PowerState{
public void powerPush(){
System.out.println("전원 off");
}
}
public class Off implements PowerState {
public void powerPush(){
System.out.println("절전 모드");
}
}
public class Saving implements PowerState {
public void powerPush(){
System.out.println("전원 on");
}
}
이어서 Laptop 클래스를 정의
public class Laptop {
private PowerState powerState;
public Laptop(){
this.powerState = new Off();
}
public void setPowerState(PowerState powerState){
this.powerState = powerState;
}
public void powerPush(){
powerState.powerPush();
}
}
Laptop 클래스는 이제 상태를 분기하는 코드가 사라지고, 인터페이스의 powerPush() 메서드를 호출하기만 합니다.
Laptop 객체를 사용하는 Client 클래스를 정의
public class Client {
public static void main(String args[]){
Laptop laptop = new Laptop();
On on = new On();
Off off = new Off();
Saving saving = new Saving();
laptop.powerPush();
laptop.setPowerState(on);
laptop.powerPush();
laptop.setPowerState(saving);
laptop.powerPush();
laptop.setPowerState(off);
laptop.powerPush();
laptop.setPowerState(on);
laptop.powerPush();
}
}
- 굳이 사용을 구분 하자면, 전략 패턴은 상속을 대체하려는 목적
- 스테이트 패턴은 코드내의 조건문들을 대체하려는 목적으로 사용됩니다.
반응형
'OOP' 카테고리의 다른 글
[OOP] Encapsulation, 캡슐화란 무엇인가 (0) | 2022.08.26 |
---|---|
[OOP] 디자인 패턴의 유형 (0) | 2022.08.20 |
[OOP] 인터페이스로 다형성을 이끌어내기 (0) | 2022.08.20 |
[OOP] Interface 인터페이스를 이용하는 이유와 장점 (0) | 2022.08.19 |
[OOP] 객체지향 기본 개념 요약 정리 (0) | 2022.08.19 |
댓글