設計模式系列之「策略模式」

YoungManSter發表於2017-10-26

歡迎收看俗到掉渣的《小Y講堂》節目,大家好,我是小Y,一個集性感毛髮與才華於一身的程式猿......小Y上一篇寫的是設計模式系列之「狀態模式」,這篇小Y要介紹它的孿生兄弟——策略模式

一、策略模式的概念

策略模式定義

定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。

使用的場景
  • 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為。
  • 一個系統需要動態地在幾種演算法中選擇一種。
  • 如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
角色介紹

策略模式通用UML

  • Strategy抽象策略角色

    策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性。

  • ConcreteStrategy具體策略角色

    實現抽象策略中的操作,該類含有具體的演算法。

  • Context封裝角色

    它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、演算法的直接訪問,封裝可能存在的變化。

二、案列實現

小Y最近在玩比較有情懷的經典遊戲魂鬥羅.歸來,看著熟悉的場景,心裡感慨萬分,以前只是想著怎麼樣才能開掛式地打爆機,現在玩起來更多的是回味經典和享受運用不同的策略闖過不同的關卡的快感。小Y在選擇角色的時候最喜歡使用比爾·雷澤這個口叼雪茄的粗狂肌肉男,同時不同的對戰模式採取不同的武器。

不同對戰模式採取不同武器裝備

tell me why?

Ok,please keep looking!


1.不同對戰模式採取不同武器的UML圖

設計模式系列之「策略模式」

①武器切換介面

public interface IWeaponStrategy {  
	public void operate();
}  
複製程式碼

②1vs1對戰模式

public class OnetoOneFight implements IWeaponStrategy {  
	public void operate() {  
		System.out.println("狙擊槍+噴射器:1vs1關鍵就是能夠快速的對對方造成大量的傷害,狙擊槍和噴射器都是高傷害的武器。"); 
	}
}   
複製程式碼

③3vs3對戰模式

public class ThreetoThreeFight implements IWeaponStrategy {  
	public void operate() {  
		System.out.println("炮類+突擊步槍:3vs3需要有著高傷害的範圍攻擊,從而壓制對手佔領據點,炮類傷害大,突擊步槍也能彌補炮類換彈速度慢的劣勢。"); 
	}
}
複製程式碼

④關卡對戰模式

public class BarrierFight implements IWeaponStrategy {  
	public void operate() {  
		System.out.println("機關槍+突擊步槍:關卡模式中,小兵比較多,但是時常也得面對BOSS的突襲,因此選擇能力較為均衡的武器是比較好的選擇。"); 
	}
}
複製程式碼

⑤對戰模式

public class Context {    
	//建構函式,你要使用玩那種模式  
	private IWeaponStrategy straegy;  
	public Context(IWeaponStrategy strategy){  
		this.straegy = strategy;
	}
	//根據不同模式裝備不同武器
	public void operate(){  
		this.straegy.operate();  
	}  
}
複製程式碼

⑥使用不同武器

public class BillRizer {   
	//比爾.雷澤出場了,他根據不同模式選擇了不同的武器  
	public static void main(String[] args) {  
		Context context;  
		//1vs1對戰
		context = new Context(new OnetoOneFight());
		context.operate(); 
		//3vs3對戰模式    
		context = new Context(new ThreetoThreeFight());  
		context.operate();   
		//關卡對戰模式  
		context = new Context(new BarrierFight());  
		context.operate(); 
	}  
}
複製程式碼

輸出的結果為:

①狙擊槍+噴射器:1vs1關鍵就是能夠快速的對對方造成大量的傷害,狙擊槍和噴射器都是高傷害的武器。
②炮類+突擊步槍:3vs3需要有著高傷害的範圍攻擊,從而壓制對手佔領據點,炮類傷害大,突擊步槍也能彌補炮類換彈速度慢的劣勢。
③機關槍+突擊步槍:關卡模式中,小兵比較多,但是時常也得面對BOSS的突襲,因此選擇能力較為均衡的武器是比較好的選擇。
複製程式碼

小Y還要繼續努力,爭取能夠早日打爆機。。。。

三、總結分析

  • 策略模式就是這麼簡單,它就是採用了物件導向的繼承和多型機制。

  • 優點:
    ①演算法可以自由切換,通過封裝角色對其進行封裝,保證對外提供“可自由切換”的策略。
    ②避免使用多重條件判斷。
    ③擴充套件性良好,增加一個策略只需要實現一個介面就可以了。

  • 缺點:
    ①策略類數量增多,策略類數量增多,每一個策略都是一個類,複用的可能性很小,類數量增多。
    ②所有的策略類都需要對外暴露,上層模組必須知道有哪些策略,然後才能決定使用哪一個策略,這與迪米特法則是相違背的,可以使用工廠方法模式、代理模式修整這個缺陷。

看到策略模式很多小夥伴會發現跟狀態模式有所混淆,下一篇小Y會對這兩種模式進行對比,請期待!!!!

簡書地址:http://www.jianshu.com/p/c59d75de1c54

Android技術交流吧

相關文章