스테이트패턴 (state pattern)
- 프로그래밍/개발새발
- 2022. 2. 24.
스테이트패턴 이란?
객체내부에 따라 행동이 변하는 패턴
사용 예시 : 게임메뉴-> 플레이 | 로드 | 세이브 | 설정 -> 각자 다른 화면(or동작)
사용하는 경우
- 조건 로직이 많아질때
- 복잡할 경우 분리시키기 위함
사용하지 않아야할 경우
- 조건 로직이 단순할때
구조
implements ?
interface란?
극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 인터페이스의 역할이자 개념
Context - 상태를 관리하는 클래스
State - 각 상태별 클래스
예제
1) 뽑기
(조건 - 보석이 없는 상태 / 보석이 있는 상태)
- 상태 인터페이스
public interface JewelState {
public void useJewel();
}
- 보석이 없는 상태
public class NoJewel implements JewelState {
JewelGacha jewelGacha;
//생성자
public NoJewel(JewelGacha jewelGacha) {
this.jewelGacha = jewelGacha;
}
@Override
public void useJewel() {
System.out.println("보석이 없습니다. 캐쉬 충전을 해보세요!");
}
- 보석이 있는 상태
public class YesJewel implements JewelState {
JewelGacha jewelGacha;
//생성자
public YesJewel(JewelGacha jewelGacha) {
this.jewelGacha = jewelGacha;
}
@Override
public void useJewel() {
System.out.println("뽑기를 시작할게요! A급 획득");
}
- 프리미엄 보석이 있는 상태
public class PremiumJewel implements JewelState {
JewelGacha jewelGacha;
//생성자
public PremiumJewel(JewelGacha jewelGacha) {
this.jewelGacha = jewelGacha;
}
@Override
public void useJewel() {
System.out.println("프리미엄 보석입니다! SSS급 뽑기 획득");
}
- context 클래스
//context 역활
public class JewelGacha Implements State {
private JewelState jewelState;
public JewelGacha(){
this.jewelState = new PremiumJewel();
}
public setJewelState(JewelState jewelState){
this.jewelState = jewelState;
}
public startGacha(){
this.jewelState.useJewel();
}
}
how to use
public class User {
//실행되는 메소드
public static void main(String args[]){
JewelGacha jewelGacha = new JewelGacha();
PremiumJewel premiumJewel = new PremiumJewel()
YesJewel yesJewel = new YesJewel()
NoJewel noJewel = new NoJewel()
jewelGacha.powerPush();
jewelGacha.setJewelState(PremiumJewel); // "프리미엄 보석입니다! SSS급 뽑기 획득"
jewelGacha.startGacha();
jewelGacha.setJewelState(YesJewel); // "뽑기를 시작할게요! A급 획득"
jewelGacha.startGacha();
jewelGacha.setJewelState(NoJewel); // "보석이 없습니다. 캐쉬 충전을 해보세요!"
jewelGacha.startGacha();
}
}
----------------
private function initTemplate()
{
$this->template = [
self::T_JOIN_P => 'getTpl_JoinPerformer'
, self::T_JOIN_C => 'getTpl_JoinClient'
, self::T_CAM_PASS => 'getTpl_CampaignPass'
, self::T_CAM_FAIL => 'getTpl_CampaignFail'
, self::T_CHAT_FIRST_ROOM_P => 'getTpl_ChatFirstRoomPerformer'
, self::T_CHAT_FIRST_ROOM_C => 'getTpl_ChatFirstRoomClient'
, self::T_SPNS_PROPOSAL => 'getTpl_ProposeSponsored'
, self::T_SPNS_ACCEPT => 'getTpl_AcceptSponsored'
, self::T_SPNS_COMPLETE => 'getTpl_completeSponsored'
, self::T_ALARM_C => 'getTpl_ChatAlarmClient'
, self::T_ALARM_P => 'getTpl_ChatAlarmPerformer'
, self::T_CAM_CHOICE => 'getTpl_CampaignChoice'
, self::T_CAM_REG_END_CLIENT => 'getTpl_CampaignRegEndClient'
, self::T_CAM_CHOICE_CAMPDATA => 'getTpl_CampaignChoiceCampData'
];
}
$method = $this->template[$tplCode];
'프로그래밍 > 개발새발' 카테고리의 다른 글
엣지 케이스와 코너케이스 [미완] (0) | 2022.04.29 |
---|---|
스태틱과 세션 [미완] (0) | 2022.04.28 |
아미나 서버이전 후 로그인 안되는 현상 mysql8 (0) | 2021.11.05 |
구글 애널리틱스 초기 설정 (0) | 2021.11.03 |
윈도우 localhost 사이트 외부에서 접속 가능 (0) | 2021.10.14 |