【設計模式 02】策略模式( Strategy)

策略模式

參考:

  • CSDN | 策略模式
  • 百家號 | 策略模式

如果某個系統需要不同的算法(如超市收銀的優惠算法),那么可以把這些算法獨立出來,使之之間可以相互替換,這種模式叫做策略模式,它同樣具有三個角色:

  1. 環境角色:使用策略的類
  2. 抽象策略角色:策略共有的抽象類或接口
  3. 具體策略角色:具體的策略的實現

策略模式的優缺點

優點:

  1. 需要新的算法時,只需要拓展策略,而不需要修改原有代碼,符合開閉原則。
  2. 避免出現過多判斷分支,提高代碼可讀性。
  3. 算法間可方便的進行繼承,替換。

缺點:

  1. 客戶端必須熟悉所有算法,并自行決定使用哪個策略
  2. 策略模式將造成產生很多策略類,可以通過使用享元模式在一定程度上減少對象的數量。

適用場景

一個系統中有很多類,這些類之間只有行為表現不同時,可以使用策略模式,策略模式在實例化策略時可以配合使用簡單工廠。

例:

比如一個收銀系統,結算時有不同的優惠策略,如 九折, 五折,滿100減10等,這些不同的優惠策略便是”具體策略角色“,而收銀系統就是 ”環境角色“,還需要定義一個 ”抽象策略角色“:

package pers.junebao.strategy_mode.discount;// 抽象策略角色
public interface BaseDiscountStrategy {double preferentialAlgorithm(double money);
}
package pers.junebao.strategy_mode.discount;// 折扣優惠(具體策略角色)
public class Discount implements BaseDiscountStrategy {private double discount;public Discount(double discount) {// Discount(double discount) {if(discount > 1)discount = 1;else if(discount < 0)discount = 0.1;this.discount = discount;}@Overridepublic double preferentialAlgorithm(double money) {return money * this.discount;}
}
package pers.junebao.strategy_mode.discount;// 滿減優惠(具體策略角色)
public class FullReduction implements BaseDiscountStrategy {private double discountPrice;  //優惠金額private double baseline;  // 滿減條件FullReduction(double baseline, double price) {this.baseline = baseline;this.discountPrice = price;}@Overridepublic double preferentialAlgorithm(double money) {if(money >= this.baseline)money -= this.discountPrice;return money;}
}

這樣,環境角色就可以自己決定使用哪種策略而不用修改代碼了

package pers.junebao.strategy_mode;import pers.junebao.strategy_mode.discount.BaseDiscountStrategy;
import pers.junebao.strategy_mode.discount.Discount;public class CashRegisterSystem {public static void main(String[] args) {BaseDiscountStrategy ds = new Discount(0.9);double purchasingPrice = 1500;double amountsPayable = ds.preferentialAlgorithm(purchasingPrice);System.out.println(amountsPayable);}
}

對于這些具體策略,可以使用簡單工廠,進一步屏蔽策略的具體細節

package pers.junebao.strategy_mode.discount;public class StrategyFactory {public static BaseDiscountStrategy getDiscountStrategy(String name) {BaseDiscountStrategy result = null;switch (name){case "九折":{result = new Discount(0.9);break;}case "五折": {result = new Discount(0.5);break;}case "滿100減10": {result = new FullReduction(100, 10);break;}case "滿1000減200": {result = new FullReduction(1000, 200);break;}default:result = new OriginalPrice();}return result;}
}
BaseDiscountStrategy ds = StrategyFactory.getDiscountStrategy("滿1000減200");

GitHub | 完整代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457453.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PL/SQL復合變量

復合變量可以將不同數據類型的多個值存儲在一個單元中。由于復合類型可以由用戶自己根據需要定義其結構&#xff0c;所以復合數據類型也稱為自定義數據類型。在PL/SQL中&#xff0c;使用%TYPE聲明的變量類型與數據表中字段的數據類型相同&#xff0c;當數據表中字段數據類型修改…

Android中使用am命令實現在命令行啟動程序詳解

在Android中&#xff0c;除了從界面上啟動程序之外&#xff0c;還可以從命令行啟動程序&#xff0c;使用的是命令行工具am. 復制代碼代碼如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019連接 WSL來編譯調試C/C++項目

因為有作業要在Linux環境下寫&#xff0c;用虛擬機直接卡成PPT&#xff0c;VS code又不會調試&#xff0c;就搞一下VS 2019吧。 環境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C環境&#xff08;gcc等&#xff09;VS要有 適用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服務平臺&#xff0c;使用它的API可以輕松搞定實時推送&#xff01;個人感覺goeasy推送更穩定&#xff0c;推送速度快&#xff0c;代碼簡單易懂上手快瀏覽器兼容性&#xff1a;GoEasy推送支持websocket 和polling兩種連接方式&#xff0c;從而可以支…

git 移動分支指針_理解git 中的HEAD指針branch指針

HEAD指針使用git checkout 來移動HEAD指針&#xff0c;移動的對象可以是分支指針也可以是快照。HEAD指針可以指向快照也可以指向branch。當指向branch時提交后會和branch指針一起向后移動&#xff0c;當不指向branch提交時時則會在一個detached狀態。分支(branch)指針使用git b…

應用程序域

好文鏈接 使用.NET建立的可執行程序 .exe&#xff0c;并沒有直接承載到進程當中&#xff0c;而是承載到應用程序域&#xff08;AppDomain&#xff09;當中。應用程序域是.NET引入的一個新概念&#xff0c;它比進程所占用的資源要少&#xff0c;可以被看作是一個輕量級的進程。 …

【設計模式 03】裝飾模式——俄羅斯套娃?

裝飾模式(俄羅斯套娃&#xff1f;) 裝飾模式&#xff1a;動態的給某些對象添加額外的功能 參考&#xff1a; 簡書 | 裝飾模式 博客園 | 簡說設計模式——裝飾模式 博客園 | 裝飾器模式 Decorator 結構型 設計模式 (十) 什么是裝飾模式 裝飾模式也叫裝飾器模式&#xff0c;p…

系統移植的四大步驟

最近在學習系統移植的相關知識&#xff0c;在學習和調試過程中&#xff0c;發現了很多問題&#xff0c;也解決了很多問題&#xff0c;但總是對于我們的開發結果有一種莫名其妙的感覺&#xff0c;糾其原因&#xff0c;主要對于我們的開發環境沒有一個深刻的認識&#xff0c;有時…

bem什么意思_bem是什么意思_bem的翻譯_音標_讀音_用法_例句_愛詞霸在線詞典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生藥0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三種濃度…

display:flex

flex&#xff1a;彈性布局 常用屬性介紹&#xff1a; flex-direction: column &#xff08;設置主容器主軸方向&#xff09; flex-flow: row wrap &#xff08;第一個參數為flex-direction&#xff0c;第二個為flex-wrap&#xff09; align-items: flex-start &#xff08;設…

Linux(Ubuntu 19.10)下 Qt5 連接 MySQL(QMYSQL driver not loaded)

Linux&#xff08;Ubuntu 19.10&#xff09;下 Qt5 連接 MySQL 安裝好 MySQL 和 Qt Qt 連接 MySQL 的代碼 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加載mysql驅動&#xff0c;這個字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

華為消息推送 有透傳通道嗎_求解在推送用透傳消息-使用廠商通道(我用的是基座測試) 用手機測試出現了“clientId離線”問題...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用戶在其它的app登錄&#xff0c;如果有問題&#xff0c;請修改密碼或重新登錄&#xff01;,// cancelText:"修改密碼",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端發展很快&#xff0c;現代瀏覽器原生 API 已經足夠好用。我們并不需要為了操作 DOM、Event 等再學習一下 jQuery 的 API。同時由于 React…

Wpf 數據綁定簡介、實例1

簡介&#xff1a;1.WPF綁定使用的源屬性必須是依賴項屬性&#xff0c;這是因為依賴項屬性具有內置的更改通知支持&#xff0c;元素綁定表達式使用了Xaml擴展標記&#xff0c; WPF綁定一個控件是使用Binding.ElementName, 綁定非控件對象時使用Source,RelativeSource,DataContex…

【設計模式 04】代理模式

代理模式 代理模式( Proxy)&#xff1a;為其他對象提供一種代理以控制對這個對象的訪問。 參考&#xff1a;refactoringguru | proxy 什么是代理模式 有時候如果想要訪問某個對象&#xff0c;但又沒辦法直接訪問或不方便直接訪問&#xff0c;可以使用代理模式&#xff0c;代理…

css 大于號 標簽_CSS設計基礎選擇器篇

點擊上方 Java項目學習 &#xff0c;選擇 星標 公眾號重磅資訊、干貨&#xff0c;第一時間送達前言&#xff1a;如果將CSS樣式應用于特定的網頁對象上&#xff0c;需要先找到目標元素。在CSS樣式中執行這一任務的部分被稱為選擇器。1 標簽選擇器優點&#xff1a;為頁面中同類型…

CSDN博客投票活動開始了

自己堅持寫博客&#xff0c;一方面是為了將自己對知識點的理解做一個總結&#xff0c;另一方面也是因為自己看到了很多無私奉獻分享自己知識的小伙伴們&#xff0c;因此自己也想像他們那樣盡自己微薄之力把自己對某一知識點的理解分享給大家&#xff0c;或許算不上什么特高級的…

crontab 提示 command not found 解決方案

crontab 提示 command not found 解決方案 今天遇見一個問題&#xff0c;crontab的定時任務會報錯&#xff1a;java command not found&#xff0c;但是手動執行腳本一直能成功。 猜想是環境變量的問題。 在crontab里添加個打印環境變量的任務&#xff1a; * * * * * echo $PAT…

java中文亂碼decode_Java中文亂碼處理

java編碼轉換過程我們總是用一個java類文件和用戶進行最直接的交互(輸入、輸出)&#xff0c;這些交互內容包含的文字可能會包含中文。無論這些java類是與數據庫交互&#xff0c;還是與前端頁面交互&#xff0c;他們的生命周期總是這樣的&#xff1a;1、程序員在操作系統上通過編…

【設計模式 05】工廠方法模式

工廠方法模式 define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate. 參考&#xff1a; refactoringguru | factory-methodjavatpoint | factory-method-design-pattern博客園| 工廠方法 簡單工廠的問題 …