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

歡迎收看俗到掉渣的《小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會對這兩種模式進行對比,請期待!!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容