設計模式-行為型模式-策略模式

来源:http://www.cnblogs.com/chenyongblog/archive/2016/01/23/5154393.html
-Advertisement-
Play Games

策略模式在實際工作中我用到了策略模式,但為什麼要有環境角色呢?這裡我貼上英文對含義的介紹,The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable....


策略模式

在實際工作中我用到了策略模式,但為什麼要有環境角色呢?

這裡我貼上英文對含義的介紹,

The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

然後看看這種設計模式的組成,

一般的,策略模式主要分為以下三個角色: 
    1. 環境角色(Context):持有一個策略類引用

         存在的優點:(1)必要時可以增加系統的安全性,減少代碼的冗餘(下文有詳解)。
    2. 抽象策略(Strategy):定義了多個具體策略的公共介面,具體策略類中各種不同的演算法以不同的方式實現這個介面;Context使用這些介面調用不同實現的演算法。一般的,我們使用介面或抽象類實現。 
    3. 具體策略(ConcreteStrategy):實現抽象策略類中的相關的演算法或操作。

我貼上簡單的實現

抽象類(抽象策略)

public abstract class AbstractStrategy {
    public abstract void algorithm();
}

具體策略-A

public class ConcreteStrategyA extends AbstractStrategy {

    @Override
    public void algorithm() {
        System.out.println("Strategy A");
    }
}

具體策略-B

public class ConcreteStrategyB extends AbstractStrategy {

    @Override
    public void algorithm() {
        System.out.println("Strategy B");
    }
}

環境角色怎麼用的呢?

public class Context {
    private AbstractStrategy strategy;

    public Context(AbstractStrategy strategy) {
        this.strategy = strategy;
    }

    public void algorithm() {
        this.strategy.algorithm();
    }
}

使用的時候我們這樣用

public static void main(String[] args) {
    //Strategy Pattern Demo
    Context context = new Context(new ConcreteStrategyA());
    context.algorithm();

    context = new Context(new ConcreteStrategyB());
    context.algorithm();
}

細心如你應該會想我使用如下代碼也能實現,Context的存在是為了什麼?

AbstractStrategy abstractStrategy = new ConcreteStrategyA();
abstractStrategy.algorithm();

abstractStrategy = new ConcreteStrategyB();
abstractStrategy.algorithm();

這裡我們看看第一種現象:

修改抽象策略中的方法

public abstract void algorithm(int number);

修改具體策略的實現

@Override
public void algorithm(int number) {
    System.out.println(number);
};

看到這裡你會不會覺得這個參數number有安全隱患,傳進來的合法嗎?於是我要判斷,so,你可以每個具體的策略中都寫一段相同的邏輯去判斷下,或者傳參時判斷下,那麼不想copy的你此刻是不是想找個地方統一判斷一把,是的Context(譯為上下文,在.NET中有DBContext。。。)此刻顯示出重要性,我們大可在構造函數中去判斷,那麼我們總結下Context的第一個優點:必要時可以增加系統的安全性,減少代碼的冗餘。還有什麼優點呢?需要我們自己去在實際的Coding中總結,希望大家共同探討。

 這裡需要和工廠模式進行比較,加以區別。


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

-Advertisement-
Play Games
更多相關文章
  • 寫這篇博文的原因是因為自己寫的代碼經常會因為返工,delay項目的交付日期。總結了一下引起項目delay的原因,大概有如下幾點:在沒有完全深熟悉需求交互細節的情況下;諸如根據不同渠道設置不同的訂單狀態變更--超時提醒和訂單取消功能。在沒有想清楚自己代碼如何實現業務邏輯的情況下;諸如對騎手排班--.....
  • Python時間函數
  • 可以將列表和元組當成普通的“數組”,他能保存任意數量任意類型的Python對象,和數組一樣都是通過數字0索引訪問元素,列表和元組可以存儲不同類型的對象,列表和元組有幾處重要區別。列表元素用([])包括,元素的個數和值可以改變,而元組用({})包括,不能更改。元組可以看成是只讀的列表一、初識列表1、下...
  • 一、目標1、搭建傳統的ssh開發環境,併成功運行(插入、查詢)2、瞭解c3p0連接池相關配置3、瞭解驗證hibernate的二級緩存,並驗證4、瞭解spring事物配置,並驗證5、瞭解spring的IOC(依賴註入),將struts2的action對象(bean)交給spring管理,自定義bean...
  • 有時候面試的時候,面試官會問靜態方法里能不能調用非靜態方法,這時候呢,你的回答是什麼呢?雖然不能直接調用,但是可以間接的調用,可以通過將一個對象的引用傳入靜態方法中,再去調用該對象的非靜態方法。靜態方法通過用傳進來的對象引用調用非靜態方法,從而達到靜態方法調用非靜態方法。 1 public clas...
  • hi之前有將近兩周的時間沒有更新,除了懶就是其他的事情耽誤了。現在好了,回家了,雖然家裡停水,外面又有積雪,天寒地凍的,但諸多不便,都比不過有點閑的好。開搞每個學PHP的必經之路——電商網站的開發。1、電商網站開發——前端一、首頁製作1.1 概況&準備整個電商網站包括什麼呢,就是首頁信息,後面的.....
  • 對C++的指針總覺得和引用差不多,其實還是挺有差別的。程式先看一個小程式: int a = 1; int& ra = a; int* pa = &ra; printf("&a = %02X\n", &a); //3EFCD0<< printf("a = %d\n", a...
  • C++Primer第5版學習筆記(二)第三章的重難點內容 你可以點擊這裡回顧第一、二章的內容 這篇文章只是C++初學者的學習筆記...。書接前文,第三章主要講這麼五個概念: 1.using聲明,我知道挺多同學寫代碼練手都要在源文件前幾句直接加using namespace std;然而us...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...