Skip to content

Latest commit

 

History

History
130 lines (108 loc) · 2.8 KB

File metadata and controls

130 lines (108 loc) · 2.8 KB

策略模式 Strategy Pattern

####目的:將各種可以互換的演算法(策略)包裝成一個類別

###冒險者要來打怪物了 經過了新手村刻苦的訓練,冒險者終於踏出了村莊,面對不同的怪物,冒險者需要選擇不同的戰鬥策略(Strategy)來跟各種怪物戰鬥,例如說一般的小怪物就隨便砍兩刀就好,遇到強一點的怪物可能就需要放技能來造成大量的傷害,遇到刀槍不入的殭屍就用火來燒。

在策略模式中,會有規範用的策略介面(Strategy),各種實際上的戰鬥策略則是實體策略(Concrete Strategy),使用策略的冒險者則是環境類別(Context)。

###類別圖
Strategy Class Diagram

###程式碼
策略介面與策略實作

/**
 * 戰鬥策略(Strategy)
 */
public interface FlightStrategy {
	/**
	 * 執行戰鬥策略
	 */
	void execute();
}

/**
 * 一般攻擊(ConcreteStrategy)
 */
public class NormalAttack implements FlightStrategy {

	@Override
	public void execute() {
		System.out.println("使用一般攻擊");		
	}
}

/**
 * 使用技能(ConcreteStrategy)
 */
public class UseSkill implements FlightStrategy {
	@Override
	public void execute() {
		System.out.println("使用超級痛的技能攻擊");		
	}
}

/**
 * 使用道具(ConcretStratey)
 */
public class UseItem implements FlightStrategy {
	@Override
	public void execute() {
		System.out.println("使用道具,丟火把");
	}
}

環境類別Context

/**
 * 冒險者(Context)
 */
public class Adventurer {
	FlightStrategy flightStrategy;  //不同戰鬥方式效果不同(strategy)
	/**
	 * 攻擊
	 */
	public void attack(){
		// 預設為普通攻擊
		if(flightStrategy == null){
			flightStrategy = new NormalAttack();
		}
		flightStrategy.execute();
	}
	
	/**
	 * 選擇不同的武器(策略)
	 */
	public void choiceStrategy(FlightStrategy strategy){
		this.flightStrategy = strategy;
	}
}

測試碼

/**
 * 策略模式-測試
 */
public class FlightTest {
	
	@Test
	public void test(){
		Adventurer ad = new Adventurer();
		
		// 史萊姆用一般攻擊就可以
		System.out.println("出現史萊姆>");
		ad.choiceStrategy(new NormalAttack());
		ad.attack();
		System.out.println();
		
		// 利害的敵人要用厲害的招式打他
		System.out.println("非常非常巨大的史萊姆>");
		ad.choiceStrategy(new UseSkill());
		ad.attack();
		System.out.println();
				
		// 出現不怕刀槍只怕火的敵人,丟道具燒他
		System.out.println("出現不怕刀槍的殭屍>");
		ad.choiceStrategy(new UseItem());
		ad.attack();
	}
	
}

測試結果

==========策略模式測試==========
出現史萊姆>>>
使用一般攻擊

非常非常巨大的史萊姆>>>
使用超級痛的技能攻擊

出現不怕刀槍的殭屍>>>
使用道具,丟火把