- State: 시스템의 모든 상태에 공통의 인터페이스를 제공한다. 따라서 이 인터페이스를 실체화한 어떤 상태 클래스도 기존 상태 클래스를 대신해 교체해서 사용할 수 있다.
- State1, State2, State3: Context 객체가 요청한 작업을 자신의 방식으로 실제 실행한다. 대부분의 경우 다음 상태를 결정해 상태 변경을 Context 객체에 요청하는 역할도 수행한다.
- Context: State를 이용하는 역할을 수행한다. 현재 시스템의 상태를 나타내는 상태 변수 (state)와 실제 시스템의 상태를 구성하는 여러 가지 변수가 있다. 또한 각 상태 클래스에서 상태 변경을 요청해 상태를 바꿀 수 있도록 하는 메서드(setState)가 제공된다. Context 요소를 구현한 클래스의 request 메서드는 실제 행위를 실행하는 대신 해당 상태 객체에 행위 실행을 위임한다.
인터페이스
interface PowerState {
public void powerPush();
}
구현된 각 상태클래스
class On implements PowerState{
public void powerPush(){
System.out.println("전원 off");
}
}
class Off implements PowerState {
public void powerPush(){
System.out.println("절전 모드");
}
}
class Saving implements PowerState {
public void powerPush(){
System.out.println("전원 on");
}
}
상태 값 분기가 사라진 laptop 클래스
class Laptop {
private PowerState powerState;
public Laptop(){
this.powerState = new Off();
}
public void setPowerState(PowerState powerState){
this.powerState = powerState;
}
public void powerPush(){
powerState.powerPush();
}
}
Main 클래스
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();
}
console
절전 모드
전원 off
전원 on
절전 모드
전원 off
powerpush에 따라 전원이 꺼지기도 켜지기도 함.
해당 내용을 추상적으로 인터페이스에 묶어서 재정의 할 수 있다는 것이 유용하게 사용 될 것 같다.
⭕ 장점
❌ 단점
인터페이스를 사용함으로서 Concrete Class를 캡슐화 한다.
따라서 ContextClass에서 어떤 클래스가 할당되었는지에 관계없이 인터페이스만을
인자로 받아서 그래도 수행.
context class의 영향없이 유연한 변경, 대처 가능.
Strategy 패턴의 경우 어떤 class를 할당할지 user, client가 결정해야함.
💨판단의 주체의 선택에 따른 대처
State 패턴은 상태변화에 따른 로직의 제어에 사용. client(x)