設計模式之策略模式(Java實現例子說明)

2021-01-07 愚公要移山1

記得在中學時代,每次考完老師評講試卷,都會說這道題有多少種解法,然後在黑板上板書第一種、第二種解法。其實這個情況就類似於今天的情況,也就是策略模式。他表示的是在遇到一種問題有多種解法的時候,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。OK,正式開始今天的文章。

一、理解策略模式

為了更好的理解這個模式,我們再舉一個例子,我們出去旅遊的時候可能有很多種出行方式,比如說我們可以坐火車、坐高鐵、坐飛機等等。不管我們使用哪一種出行方式,最終的目的地都是一樣的。也就是選擇不同的方式產生的結果都是一樣的。

有了這個例子,我相信你應該對其思想有了一個基本的認識,下面看一下其正式的概念介紹:

定義一系列的算法,把每一個算法封裝起來, 並且使它們可相互替換

二、實現策略模式

策略模式把對象本身和運算規則區分開來,因此我們整個模式也分為三個部分。

環境類(Context):用來操作策略的上下文環境,也就是我們遊客。抽象策略類(Strategy):策略的抽象,出行方式的抽象具體策略類(ConcreteStrategy):具體的策略實現,每一種出行方式的具體實現。下面我們代碼去實現一遍就能很清楚的理解了,

第一步:定義抽象策略接口

第二步:具體策略類

第三步:環境類實現

三、分析策略模式

1、為什麼要使用策略模式?

策略模式的優點:

我們之前在選擇出行方式的時候,往往會使用if-else語句,也就是用戶不選擇A那麼就選擇B這樣的一種情況。這種情況耦合性太高了,而且代碼臃腫,有了策略模式我們就可以避免這種現象,策略模式遵循開閉原則,實現代碼的解耦合。擴展新的方法時也比較方便,只需要繼承策略接口就好了上面列出的這兩點算是策略模式的優點了,但是不是說他就是完美的,有很多缺點仍然需要我們去掌握和理解,

客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。策略模式會出現很多的策略類。context在使用這些策略類的時候,這些策略類由於繼承了策略接口,所以有些數據可能用不到,但是依然初始化了。2、與其他模式的區別?

(1)與狀態模式的區別

策略模式只是條件選擇方法,只執行一次方法,而狀態模式是隨著狀態的改變不停地更改執行方法。舉個例子,就好比我們旅遊,對於策略模式我們只需要選擇其中一種出行方法就好了,但是狀態模式不一樣,可能我們到了A地點選擇的是火車,到了B地點又選擇飛機,根據不同的狀態選擇不同的出行方式。

(2)與工廠模式的區別

工廠模式是創建型模式 ,它關注對象創建,提供創建對象的接口,讓對象的創建與具體的使用客戶無關。 策略模式是對象行為型模式 ,它關注行為和算法的封裝 。再舉個例子,還是我們出去旅遊,對於策略模式我們只需要選擇其中一種出行方法就好,但是工廠模式不同,工廠模式是你決定哪種旅行方案後,由工廠代替你去構建具體方案(工廠代替你去買火車票)。

3、使用場景是什麼?

說實話,對於設計模式來說,使用場景僅僅只是舉一兩個例子。如果你能夠理解我們出去旅遊的這個案例,基本上你也就能在自己遇到這種情況的時候自動的去選擇它。這裡就不說了。

OK,策略模式還是比較簡單的。一句話說明白就是一個問題有好幾種解法,我們選擇其中一種就可以了。

相關焦點

  • 設計模式之狀態模式(java實現)
    如果難以理解我們拿上面商場打折扣的那個例子來說明。我們買衣服的時候,商家會把客戶買多少衣服封裝成一個抽象類,客戶買一件衣服,那就使用買一件打九折的機制去處理,客戶買兩件,那就使用買兩件打5折的機制去處理。但是限購兩件,當用戶買三件的話直接拉入黑名單。還不理解的話,再來個類圖看看。
  • 大神詳解,這麼詳細的Java設計模式不收藏可惜了
    為什麼再看一遍設計模式,主要有幾個原因:***,很多優秀的源碼基本都使用了設計模式,明確設計模式能夠更好的看源碼。第二,很多中間件設計理念也是基於設計模式的,還有其他的語言,都有自己的設計優秀實踐。對於我來說,設計模式始於java,不止於java。第三,有了這種規範,可以更好的和他人溝通,言簡意賅。
  • 重學Java 設計模式:實戰命令模式「模擬高檔餐廳八大菜系,小二點單...
    當然如果你開發過一些桌面應用,也會感受到這樣設計模式的應用場景。從這樣的模式感受上,可以想到這是把邏輯實現與操作請求進行分離,降低耦合方便擴展。命令模式是行為模式中的一種,以數據驅動的方式將命令對象,可以使用構造函數的方式傳遞給調用者。調用者再提供相應的實現為命令執行提供操作方法。可能會感覺這部分有一些饒,可以通過對代碼的實現進行理解,在通過實操來熟練。
  • 設計模式之狀態模式總結篇
    本文出處凱哥Java(kaigejava)講《23種設計模》系列教程種的《狀態模式總結篇》主要解決的問題是什麼?對象的行為依賴於對象的狀態變化(屬性變更),並且根據屬性值(狀態)的改變而改變相關的行為。如,出不出糖果這個行為受糖果機裡面有沒有糖果和有沒有投幣這兩個狀態影響而改變的。什麼時候或者是什麼場景下使用狀態模式?
  • 6.java設計模式之適配器模式
    基本需求:將一個220V的電壓輸出成5V的電壓,其中220V電壓為被適配者,變壓器為適配器,5v電壓為適配目標基本介紹:適配器模式屬於結構型模式,將某個類的接口轉換成客戶端期望的另一個接口表示其別名為包裝器(Wrapper) 分為類適配器模式,對象適配器模式,接口適配器模式用戶的角度看不到被適配者,是解耦的,用戶調用適配器轉化出來的目標接口方法,適配器再調用被適配者的相關接口方法類適配器模式:Adapter 類,通過繼承 src 類,實現 dst 類接口,完成 src->dst
  • 程式設計師:java單例模式,為什麼要加雙重鎖?為什麼要加volatile?
    單例模式單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
  • 3分鐘程式設計師快餐,設計模式之狀態模式,你學會了麼?
    今天我們來講一講一個設計模式,非常適合這種程序運行過程中,有著多個不同狀態相互切換的設計模式,狀態模式。狀態模式顧名思義,就是多個狀態不停的切換過程中,不同的狀態實現不同的方法。在上述售貨機例子中,我們可以抽象出這麼幾種狀態:空閒狀態: 沒有用戶來使用這臺無人售貨機,可能會做一些廣告的展示等動作。
  • MVC設計模式的總結
    採用三層軟體設計架構後,軟體系統在可擴展性和可復用性方面得到極大提高,在 資源分配策略設計合理運用的同時,軟體的性能指標也得到提升,系統的安全性和易管東北 理性也得到改善。這本書解釋了模式的用處,同時也使得設計模式得到廣泛普及。在書中,他們四人記錄了他們長期工作中發現的經典 23 個設計模式。
  • MVC設計模式(模型-視圖-控制器)設計模式介紹
    3.2 設計和實現每個視圖   設計每個視圖的顯示形式,它從模型中獲取數據,將它們顯示在屏幕上。   3.3 設計和實現每個控制器   對於每個視圖,指定對用戶操作的響應時間和行為。在模型狀態的影響下,控制器使用特定的方法接受和解釋這些事件。控制器的初始化建立起與模型和視圖的聯繫,並且啟動事件處理機制。
  • 基於模式的SoC設計方法研究
    傳統SoC設計流程中,EDA設計方法只作用於SoC後級,缺乏SoC前級設計方法與系統驗證策略,從而導致了RTL電路模型中錯誤成分複雜化與驗證人工開銷激增. 另外,軟體開發者必須等到硬體的設計和結構都完成並通過驗證之後,才能開始軟體的設計和實現,所以開發的周期將會持續很長,產品的競爭力會因此而下降.
  • 圖解常見的九種設計模式
    在軟體工程中,設計模式(Design Pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。根據模式的目的來劃分的話,GoF(Gang of Four)設計模式可以分為以下 3 種類型:1、創建型模式:用來描述 「如何創建對象」,它的主要特點是 「將對象的創建和使用分離」。包括單例、原型、工廠方法、抽象工廠和建造者 5 種模式。
  • JAVA觀察者模式與中介者模式怎麼區分?
    廢話不多說,直接步入正題↓先說觀察者模式通俗點理解就是:要有觀察者、被觀察者兩類元素,被觀察者發生改變時,觀察者們都能第一時間「發現」改變。舉個例子:某班有三個小哥哥、一個小姐姐,小姐姐很漂亮,小哥哥們很喜歡。於是乎,這三個小哥哥時刻觀察著小姐姐的一舉一動。
  • 淺談Java Web經典三層架構和MVC框架模式
    一、MVC設計模式1.MVC的概念首先我們需要知道MVC模式並不是javaweb項目中獨有的,MVC是一種軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    大家還需要知道的是:多態是java面向對象的三大特徵之一。而java的多態分為兩種:靜態多態和動態多態。靜態多態的小名叫編譯時多態,通過方法的重載來實現。動態多態是運行時的多態形式,通過對象的多態性質來實現。多態有哪些常用的實現形式呢?分為三種:1,父類作為方法的行參。2,父類作為方法的一個返還值。3,父類引用直接指向子類對象。接下來需要注意的是,敲黑板!
  • 人工生命 2.0.2 更新,模擬體全息存貯的模式識別
    (接上回 給青蛙找個工作:走蹺蹺板),以下為本次項目更新內容 : 2019-11-11  第一版字母的模式識別演示 這是個比較重要的更新,也是青蛙切換到3D腦的第一個正式版本更新,它實現了ABCD四個字母的識別。
  • Java transient關鍵字使用小記
    1.transient的作用及使用方法我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
  • Java反射機制深入詳解
    反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變量和方法並且顯示出來。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
  • 黑暗模式大勢所趨,盤點常見APP黑暗模式設計
    前段時候,一則「蘋果稱:微信若堅持不開發夜間模式,或面臨下架」的消息傳播網際網路,由於展開對黑暗模式的討論與探究不絕於耳,本文也以此為話題聊聊常見的APP黑暗模式設計。
  • 如何設計商業模式?——《商業模式新生代》讀書筆記之七
    讀書筆記分享——《商業模式畫布》之一、幾種常見的商業模式之後,接下來幾期我們將了解如何進行商業模式的設計#設計的方法。為了確保大家有耐心讀完所有的內容,對於這幾種商業模式設計的方法我也將分為幾期來為大家進行詳細解讀。
  • Java面向對象之final、abstract抽象、和變量生命周期
    只要滿足以下條件就可以考慮把一個類設計成final類:在設計之初就考慮不進入繼承體系的類。出於安全考慮,類的實現細節不允許被拓展和修改。比如:基本數據類型的包裝類就是一個典型的例子。該類不會再被拓展。在父類中提供了統一的算法骨架,不允許子類通過方法覆蓋來修改其實現細節, 此時使用final修飾。比如在模板方法設計模式中。在構造器中調用的方法(初始化方法),此時一般使用final修飾。這也是構造器不能被繼承的原因。