設計模式:策略模式

来源:https://www.cnblogs.com/gcm688/archive/2019/01/18/10289804.html
-Advertisement-
Play Games

什麼是策略模式 策略是我們在處理問題是所採用的步驟方法。如我要過年回家,方式有飛機、火車,汽車等,這幾種方式就是策略。 再比如我們商城要搞一個活動,給用戶生成一批優惠券,5折,7折,免單等,這些方法也是策略。 一個策略模式的例子: 模擬一個銷售給客戶報價的業務場景。我們銷售人員對不同的客戶制定不同的 ...


什麼是策略模式

  策略是我們在處理問題是所採用的步驟方法。如我要過年回家,方式有飛機、火車,汽車等,這幾種方式就是策略。

再比如我們商城要搞一個活動,給用戶生成一批優惠券,5折,7折,免單等,這些方法也是策略。

一個策略模式的例子:

  模擬一個銷售給客戶報價的業務場景。我們銷售人員對不同的客戶制定不同的報價。

    普通客戶----不打折

    一星客戶----9折

    二星客戶----8折

    三星客戶--- 7折

  如果不採用策略模式大概處理方式如下:

	public double getPrice(String type, double price){
		if(type.equals("普通客戶")){
			System.out.println("不打折,原價");
			return price;
		}else if(type.equals(“一星客戶")){
			return price*0.9;
		}else if(type.equals(“二星客戶")){
			return price*0.8;
		}else if(type.equals(“三星客戶")){
			return price*0.7;
		}
		return price;
	}

  簡單粗暴,非常容易。但一但類型較多,業務處理複雜,流程長時,或者要增加業務時,整個代碼控制會難以維護。

採用策略模式能將這類問題很好處理,將每個分支問題都生成一個業務子類,具體用哪個子類就根據業務選擇。

採用策略模式:

 

/**
 * 抽象策略對象
 */
public interface Stratgey {

    double getPrice(double price);
}

  

/**
 * 普通客戶 不打折
 */
public class NewCustomerStrategy implements Stratgey {
    @Override
    public double getPrice(double price) {
        System.out.println("普通客戶不打折");
        return price;
    }
}

  

/**
 * 一級客戶 9折
 */
public class LeaveOneCustomerStrategy implements Stratgey {
    @Override
    public double getPrice(double price) {
        System.out.println("一級客戶9折");
        return price;
    }
}

  

/**
 * 二級客戶8折
 */
public class LeaveTwoCustomerStrategy implements Stratgey {
    @Override
    public double getPrice(double price) {
        System.out.println("二級客戶8折");
        return price;
    }
}

  

/**
 * 三級客戶7折
 */
public class LeaveThreeCustomerStrategy implements Stratgey {
    @Override
    public double getPrice(double price) {
        System.out.println("三級客戶7折");
        return price;
    }
}

  再來一個管理策略對象的類

/**
 * 負責和具體策略類交互
 *實現演算法和客戶端分離
 */
public class Context {

    //當前的策略對象
    private Stratgey stratge;

    public Context(Stratgey stratge) {
        this.stratge = stratge;
    }

    public void printPrice(double s){
        stratge.getPrice(s);
    }
}

  

public class Client {

public static void main(String[] args) {
//不同的策略
Stratgey stratge = new NewCustomerStrategy();
Stratgey one = new LeaveOneCustomerStrategy();
Stratgey two = new LeaveTwoCustomerStrategy();
Stratgey three = new LeaveThreeCustomerStrategy();

//註入具體的策略
Context context1 = new Context(stratge);
context1.printPrice(998);
Context context2 = new Context(one);
context2.printPrice(998);
Context context3 = new Context(two);
context3.printPrice(998);
}
}

  當對應不同的客戶時,就註入不同的銷售策略。

策略模式將不同的演算法封裝成一個對象,這些不同的演算法從一個抽象類或者一個介面中派生出來,客戶端持有一個抽象的策略的引用,這樣客戶端就能動態的切換不同的策略。

和工廠模式區別在於策略模式自己實現業務處理過程,工廠模式在於所有業務交由工廠方法處理。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文由雲+社區發表 作者:騰訊工蜂用戶:王二衛 從不一樣的視角瞭解git,以便更好的使用git 一、git & git 版本庫認識 git 是一個內容定址的文件系統,其核心部分是一個簡單的鍵值對資料庫(key value data store),可以向該資料庫插入任意類型的內容,它會返回一個40位長 ...
  • 有些小伙伴不熟悉Jenkins, 在mac上安裝,會選擇pkg 安裝包, 安裝後又想卸載,苦於卸載不幹凈,今天給到一個命令即可搞定. 對應qq群號:616961231打開終端輸入下麵命令'/Library/Application Support/Jenkins/Uninstall.command' ...
  • 目錄 0).簡單工廠模式 1).工廠方法模式 2).抽象工廠模式 3).單例模式 4).構建者模式 5).原型模式 6).適配器模式 7).修飾者模式 8).代理模式 9).外觀模式 10).橋接模式 11).組合模式 12).享元模式 13).策略模式 14).模板方法模式 15).觀察者模式 1 ...
  • 第一篇:數據倉庫的概述 1.數據倉庫基本概念 數據倉庫是一個面向主題的、集成的、不可更新的、隨時間變化的。 它用於支持企業或組織的決策分析處理。 2.數據分層 ODS(Operatitional data store)層:稱為源數據層,表結構與業務系統的表保持基本一致。通常在ODS層主要做一些欄位的 ...
  • GitHub AES 高級數據加密標準(Advanced Encryption Standard),簡稱AES,由美國政府於1997年開始公開徵集的新的數據加密標準演算法。經過三輪篩選,美國政府最終於2000年10月2日正式宣佈選中密碼學家Joan Daemen和Vincent Rijmen提出的RI ...
  • 最近做面試題,遇到一些問題,整理一下! 1、Overloaded的方法是否可以改變返回值的類型? 答案:可以。 overload是重載,overloaded是什麼?重載的過去式?我還以為是我沒見過的註解,也沒有給限定條件,代碼測試一下。 註釋部分報錯,很明顯,如果吧這個單詞也解釋為重載的話,重載的基 ...
  • operator 是 C++ 的(運算符的)重載操作符。用作擴展運算符的功能。 它和運算符一起使用,表示一個運算符函數,理解時應將 【operator+運算符】 整體上視為一個函數名。 要註意的是:一方面要使運算符的使用方法與其原來一致,另一方面擴展其功能只能通過函數的方式(c++中,“功能”都是由 ...
  • 本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。python編程規範系列--建議08~18 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...