스테이트패턴 (state pattern)

 

스테이트패턴 이란?

객체내부에 따라 행동이 변하는 패턴

 

사용 예시 : 게임메뉴-> 플레이 | 로드 | 세이브 | 설정 -> 각자 다른 화면(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];

 

 

댓글

Designed by JB FACTORY