読者です 読者をやめる 読者になる 読者になる

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

StateをAS2で書いてみた。

今日のデザインパターンはStateを書いてみる。
状態の切り替えはメソッドで直接やってます。時間軸で切り替えられたほうが良かったかなあ。


■インターフェイス State.as

interface State {
	
	/**行う動作を設定*/
	public function play():String
	public function eat():String
	public function drink():String
	public function changeState(man:person):Void

}


■状態インスタンス1 friday.as

class friday implements State {
	
	private  static var _state:State
	private var _dayname:String = "金曜日"
	
	private function friday() {}
	
	public static function getInstance():State {
		if (_state == null) {
			_state = new friday();
		}
		return _state;
	}
	
	public function play():String {
		return _dayname+"に野球"
	}
	public function eat():String {
		return _dayname+"にラーメン"
	}
	public function drink():String {
		return _dayname+"に焼酎"
	}
	public function changeState(man:person):Void {
		man.setState(saturday.getInstance())
	}
} 


■状態インスタンス2 saturday.as

class saturday implements State{
	
	private static var _state:State
	private var _dayname:String="土曜日"
	
	private function saturday() {}
	
	public static function getInstance():State {
		if (_state == null) {
			_state = new saturday();
		}
		return _state;
	}
	
	public function play():String {
		return _dayname+"にサッカー"
	}
	public function eat():String {
		return _dayname+"にそば"
	}
	public function drink():String {
		return _dayname+"にホッピー"
	}
	public function changeState(man:person):Void {
		man.setState(sunday.getInstance())
	}
}


■状態インスタンス3 sunday.as

class sunday implements State {
	
	private static var _state:State
	private var _dayname:String="日曜日"
	
	private function sunday() {}
	
	public static function getInstance():State {
		if (_state == null) {
			_state = new sunday();
		}
		return _state;
	}
	
	public function play():String {
		return _dayname+"にマラソン"
	}
	public function eat():String {
		return _dayname+"にカレー"
	}
	public function drink():String {
		return _dayname+"に酒"
	}
	public function changeState(man:person):Void {
		man.setState(friday.getInstance())
	}
}


■状態で振る舞いを変えるクラス person.as

class person {
	
	private var _state:State
	
	public function person() {
		_state = friday.getInstance()
	}
	
	public function play():String {
		return  _state.play()
	}
	
	public function eat():String {
		return _state.eat()
	}
	
	public function drink():String {
		 return _state.drink()
	}
	
	public function setState(state:State):Void {
		_state = state
	}
	
	public function getState(state:State):State {
		return _state
	}

	public function changeState():Void {
		_state.changeState(this)
	}	
}


■実行

var person1:person = new person()
trace(person1.play())
trace(person1.eat())
trace(person1.drink())

person1.changeState()
trace(person1.play())
trace(person1.eat())
trace(person1.drink())

person1.changeState()
trace(person1.play())
trace(person1.eat())
trace(person1.drink())


■結果

金曜日に野球
金曜日にラーメン
金曜日に焼酎
土曜日にサッカー
土曜日にそば
土曜日にホッピー
日曜日にマラソン
日曜日にカレー
日曜日に酒


strategyと似たようなものか。変えてるのはstateの各サブクラスをSingletonにしている位か。メソッド固定で状態だけ切り替えれば振る舞いが変わる。状態によるswitchでの条件分岐は死ぬほど書いてたんですが、OOPが使えるとすんなりいけて便利かも。