Modeパターンについて。


マルチスレッドに対応した、Stateパターン
ゲーム開発における各画面を表現するのに最適である。
別のModeに切り替わる時、requestでデータを渡すことが可能。またsessionとして共有することもできる。
毎フレーム実行する処理はUpdateメソッド内で行う。

クラス図


クラス図ダウンロード
サンプル
			

package test_a;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.amaraimusi.zss_lib.CalcUtil;


public class Test014Mode  {


     

    public static void main(String[] args) {
        
        CalcUtil.init();//汎用計算クラス
        
        
        System.out.println("テスト開始");
        
        ModeBase nekoMode=new NekoMode();
        ModeBase yagiMode=new YagiMode();
        ModeBase butaMode=new ButaMode();

        List modeList=new ArrayList();
        modeList.add(nekoMode);
        modeList.add(yagiMode);
        modeList.add(butaMode);
        
        ModeControl modeCon=new ModeControl();
        modeCon.Init(modeList, 0);
        
        //擬似スレッド
        for(int i=0;i<10;i++){
            modeCon.Update();
        }
        
        
        System.out.println("テスト終了");
        
        

    }
    
}

class ModeControl{
    
    private ModeBase m_actMode;//現在モードクラス。
    
    private List m_modeList;//モードリスト
    
    public void Init(List modeList,int iniModeIndex){
        
        for(ModeBase mode:modeList){
            mode.setModeControl(this);
        }
        
        //m_actModeIndex=iniModeIndex;
        m_modeList=modeList;
        this.changeMode(iniModeIndex, null);
        
    }
    
    public void Update(){
        
        m_actMode.Update();
    }
    
    public void changeMode(int modeIndex,Map request){
        m_actMode=m_modeList.get(modeIndex);
        m_actMode.OnChange(request);
    }
    
}
//Digインターフェース
abstract class ModeBase{
    

    private ModeContainer m_dataCon;
    private Map m_sesMap;
    public ModeControl m_modeCon;
    
    public ModeBase(){
        
        m_dataCon=ModeContainer.getInstance();
        m_sesMap=m_dataCon.sessionMap;
        
    }
    
    //毎フレーム呼び出される。
    abstract public void Update();
    
    //モード変更直後に呼び出される。
    abstract public void OnChange(Map request);
    

    
    protected void changeMode(int modeIndex,Map request){
        m_modeCon.changeMode(modeIndex,request);
    }
    
    protected void changeMode(int modeIndex){
        m_modeCon.changeMode(modeIndex,null);
    }
    

    
    protected void setSession(Object key,Object obj){
        m_sesMap.put(key, obj);
    }
    
    protected Object getSession(Object key){
        return m_sesMap.get(key);
    }
    
    public void setModeControl(ModeControl modCon){
        this.m_modeCon=modCon;
    }

}

/**
 * モードクラス用のコンテナ。データ保持用
 * @author Administrator
 *
 */
class ModeContainer{
    

    public Map sessionMap;//セッションコンテナ
    
    private static ModeContainer mySelf;
    
    private ModeContainer(){
    
        sessionMap=new HashMap();
        
    }
    
    public static ModeContainer getInstance(){
        if(mySelf==null){
            mySelf=new ModeContainer();
        }
        return mySelf;
    }
}

class NekoMode extends ModeBase{
    
    public NekoMode(){
        super();
        
    }

    @Override
    public void Update() {
        
        System.out.println("猫モードのUpdate");
        
        // 1/4の確率でモード変更
        int r=CalcUtil.rnd(4);
        if(r==1){
            System.out.println("山羊モードに変更します。");
            this.changeMode(ModeConst.YAGI_MODE);//山羊モードに変更
        }
    }

    @Override
    public void OnChange(Map request) {

        System.out.println("猫モードのOnChange");
    
    }
    
}

class YagiMode extends ModeBase{

    public YagiMode(){
        super();
        
    }

    
    @Override
    public void Update() {
        System.out.println("山羊モードのUpdate");
        
        // 1/4の確率でモード変更
        int r=CalcUtil.rnd(4);
        if(r==1){
            System.out.println("豚モードに変更します。");
            Map request=new HashMap();
            request.put("yagi","山羊からのお手紙");
            
            this.changeMode(ModeConst.BUTA_MODE,request);//豚モードに変更
        }
    }


    @Override
    public void OnChange(Map request) {
        
        System.out.println("山羊モードのOnChange");
        
    }
    
}

class ButaMode extends ModeBase{

    public ButaMode(){
        super();
        
    }

    
    @Override
    public void Update() {

        // 1/4の確率でモード変更
        System.out.println("豚モードのUpdate");
        int r=CalcUtil.rnd(4);
        if(r==1){
            System.out.println("山羊モードに変更します。");
            this.changeMode(ModeConst.NEKO_MODE);//山羊モードに変更
        }
    }


    @Override
    public void OnChange(Map request) {
        
        System.out.println("豚モードのOnChange");
        

        if(request!=null){
            System.out.println("豚がリクエストから受け取った情報:"+request.get("yagi"));
        }
        
    }
    
}

//各モードクラスを表す定数
class ModeConst{
    public static int NEKO_MODE=0;
    public static int YAGI_MODE=1;
    public static int BUTA_MODE=2;
}







サンプルダウンロード(Test014Mode.java)