摘要:策略模式的使用場景針對同一類型問題的多種處理方式,僅僅是具體行為有差別時需要安全地封裝多種同一類型的操作時出現同一抽象類有多個子類,而又需要使用或者來選擇具體子類時。抽象策略角色這是一個抽象角色,通常由一個接口或抽象類實現。
寫代碼時總會出很多的if…else,或者case。如果在一個條件語句中又包含了多個條件語句就會使得代碼變得臃腫,維護的成本也會加大,而策略模式就能較好的解決這個問題,本篇博客就帶你詳細了解策略模式。
策略模式的定義和使用場景1、定義:策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使他們可以相互替換,讓算法獨立于使用它的客戶而獨立變化。
分析下定義,策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現在策略接口的行為上,另外為了達到最后一句話的目的,也就是說讓算法獨立于使用它的客戶而獨立變化,我們需要讓客戶端依賴于策略接口。
2、策略模式的使用場景:
1.針對同一類型問題的多種處理方式,僅僅是具體行為有差別時;
2.需要安全地封裝多種同一類型的操作時;
3.出現同一抽象類有多個子類,而又需要使用 if-else 或者 switch-case 來選擇具體子類時。
這個模式涉及到三個角色:
環境(Context)角色:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。
策略模式的典型代碼如下:
抽象策略類
public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
具體策略類
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相關的業務 } } public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { //相關的業務 } }
環境策略類
public class Context { //持有一個具體策略的對象 private Strategy strategy; /** * 構造函數,傳入一個具體策略對象 * @param strategy 具體策略對象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
實例:
假設鵝廠推出了3種會員,分別為會員,超級會員以及金牌會員,還有就是普通玩家,針對不同類別的玩家,購買《王者農藥》皮膚有不同的打折方式,并且一個顧客每消費10000就增加一個級別,那么我們就可以使用策略模式,因為策略模式描述的就是算法的不同,這里我們舉例就采用最簡單的,以上四種玩家分別采用原價(普通玩家),九折,八折和七價的收錢方式。
那么我們首先要有一個計算價格的策略接口:
public interface CalPrice { //根據原價返回一個最終的價格 Double calPrice(Double orgnicPrice); }
下面是4種玩家的計算方式的實現:
public class Orgnic implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice; } } public class Vip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.9; } } public class SuperVip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.8; } } public class GoldVip implements CalPrice { @Override public Double calPrice(Double orgnicPrice) { return orgnicPrice * 0.7; } }
我們看客戶類,我們需要客戶類幫我們完成玩家升級的功能:
public class Player { private Double totalAmount = 0D;//客戶在鵝廠消費的總額 private Double amount = 0D;//客戶單次消費金額 private CalPrice calPrice = new Orgnic();//每個客戶都有一個計算價格的策略,初始都是普通計算,即原價 //客戶購買皮膚,就會增加它的總額 public void buy(Double amount) { this.amount = amount; totalAmount += amount; if (totalAmount > 30000) {//30000則改為金牌會員計算方式 calPrice = new GoldVip(); } else if (totalAmount > 20000) {//類似 calPrice = new SuperVip(); } else if (totalAmount > 10000) {//類似 calPrice = new Vip(); } } //計算客戶最終要付的錢 public Double calLastAmount() { return calPrice.calPrice(amount); } }
接下來是客戶端調用,系統會幫我們自動調整收費策略:
public class Client { public static void main(String[] args) { Player player = new Player(); player.buy(5000D); System.out.println("玩家需要付錢:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付錢:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付錢:" + player.calLastAmount()); player.buy(12000D); System.out.println("玩家需要付錢:" + player.calLastAmount()); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69152.html
摘要:設計模式的分類經典應用框架中常見的設計模式分為三類創建型模式對類的實例化過程的抽象。對象的結構模式是動態的。對象的行為模式則使用對象的聚合來分配行為。設計模式是個好東西,以后肯定還要進一步的學習,并且在項目中多實踐,提升自己的設計能力。 什么是設計模式? Christopher Alexander?說過:每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣...
摘要:常用設計模式大型單頁應用里,復雜度上升到一定程度時,沒有適當的設計模式進行降耦,后續的開發也難以下手。而設計模式正是為了降耦而存在。特點滿足單一職責原則使用代理模式,不在構造函數中判斷是否已經創建過該單例滿足惰性原則應用彈出登陸窗口。 JS常用設計模式 大型單頁應用里,復雜度上升到一定程度時,沒有適當的設計模式進行降耦,后續的開發也難以下手。而設計模式正是為了降耦而存在。 單例模式 單...
摘要:在這個算法類中封裝了大量查找算法,該類代碼將較復雜,維護較為困難。換言之,策略模式只適用于客戶端知道算法或行為的情況。策略模式概覽圖參考菜鳥教程策略模式十種常用的設計模式大部分自己總結,部分摘抄與模式之策略模式 策略模式 ? 我們都知道商場打折的時候,會根據會員的等級情況進行不同的折扣優惠,如果是VIP會員,那么可能就是5折優惠,如果是一般會員就是8折優惠,如果是普通顧客就是9折...
摘要:前言設計模式幾十種,閱讀了設計模式與開發實踐這本書后,個人感覺就是圍繞對象來設計的,發現日常寫代碼能用上的并不多,下面是常用的幾種設計模式。前端服務端可以參考我的另一個倉庫地址,一個簡單的實時聊天參考來自設計模式與開發實踐讀書筆記 前言 設計模式幾十種,閱讀了《JavaScript設計模式與開發實踐》這本書后,個人感覺js就是圍繞對象來設計的,發現日常寫代碼能用上的并不多,下面是常用的...
閱讀 2121·2023-04-26 02:19
閱讀 1914·2021-11-19 09:40
閱讀 1704·2021-09-29 09:35
閱讀 3575·2021-09-29 09:34
閱讀 4297·2021-09-07 10:16
閱讀 5530·2021-08-11 11:14
閱讀 3578·2019-08-30 15:54
閱讀 1629·2019-08-30 15:53