前言
在軟體領域中,設計模式作為一種經典的開發實踐常常需要我們去深入的理解,而策略模式作為設計模式的一種,使用頻率也是相對來說比較高的,在Java中,當我們學習TreeSet集合的時候,就採用了經典的策略模式的思想,本文主要講解策略模式。
概念
其思想是針對一組算法,將每一種算法都封裝到具有共同接口的獨立的類中,從而是它們可以相互替換。策略模式的最大特點是使得算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。
特點
策略模式體現了面向對象程序設計中非常重要的兩個原則:
封裝變化的概念。編程中使用接口,而不是使用的是具體的實現類(面向接口編程)。
舉例:我們就以Java中的TreeSet為例,TreeSet僅僅知道它只是接收一個Comparator這種接口類型,但是具體是哪種實現類,TreeSet並不關心,實現類在真正的傳入TreeSet之前,TreeSet本身是不知道的,所以我們可以自己去實現Comparator接口,然後在實現類裡面去封裝好我們自己的規則(這裡的規則你可以當做是算法),比如說我們要實現對一個集合的元素排序,但是到底是要升序排序還是降序排序,這個完全由我們來去控制,我們可以把這種變化的內容封裝到自己的實現類中,真正運行的時候才知道具體的實現。
組成
抽象策略角色這個是一個抽象的角色,通常情況下使用接口或者抽象類去實現。對比來說,就是我們的Comparator接口。 具體策略角色包裝了具體的算法和行為。對比來說,就是實現了Comparator接口的實現一組實現類。 環境角色內部會持有一個抽象角色的引用,給客戶端調用。對比來說,就是我們的TreeSet類。說明:TreeSet內部一定會有一個策略類的一個成員變量,這樣做的目的在於可以當我們在去創建TreeSet對象的時候,可以接收我們向TreeSet類中傳遞的具體的策略類。
編寫步驟
定義抽象策略角色(為策略對象定義一個公共的接口)編寫具體策略角色(實際上就是實現上面定義的公共接口)定義環境角色,內部持有一個策略類的引用
案例
實現一個加減乘除的功能。
1、定義抽象策略角色
2、定義具體策略角色(本例子僅僅演示,只是定義加、減兩種具體策略)
加法策略:
減法策略:
3、環境角色
4、測試類
總結
通過案例的形式相信大家已經對策略模式應該有所了解了吧,其實對比的理解去學習是可以快速上手的。不過在這裡呢還是要多說一句,策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成一個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。其實每種設計模式都有它各種的優缺點,在這裡呢,我們就要具體情況具體分析了。
每日一題
在Java程式語言中,有內存洩露的問題嗎?如果有,那麼什麼情況下會導致內存洩露呢?