學C#之設計模式系列筆記(1)策略模式

来源:http://www.cnblogs.com/MGKKKK/archive/2016/12/21/6208411.html
-Advertisement-
Play Games

一、借鑒說明 1.《Head First Design Patterns》(中文名《深入淺出設計模式》) 2.維基百科,策略模式,https://zh.wikipedia.org/wiki/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F 二、策略模式 基礎知識 將一類相同的... ...


一、借鑒說明

  1.《Head First Design Patterns》(中文名《深入淺出設計模式》)

  2.維基百科,策略模式,https://zh.wikipedia.org/wiki/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F

二、策略模式

  • 基礎知識

  將一類相同的演算法封裝起來,形成演算法族,只提供相同的介面給外界,同一演算法族內的演算法可以互相替換,外界使用時,沒有感覺什麼不同,即演算法族內的演算法獨立於使用者存在。

  • 具體例子

  學生Student和老師Teacher去學校School的方式有很多種:坐公交Bus,坐地鐵Subway,坐車Car等等。

  因此就有了第一種情況:Student有goToSchoolByBus、goToSchoolBySubway、goToSchoolByCar函數,Teacher也有goToSchoolByBus、goToSchoolBySubway、goToSchoolByCar函數,UML如圖所示。但是這樣太過冗餘,這裡的冗餘具體是指:"搭乘交通工具的方式"是可以共用的部分,不管是Student還是Teacher都是可以坐Bus、Subway、Car的。還有就是不靈活,如果以後突然有別的需求的話,例如走路Walk去學校的話,那麼Student和Teacher就要分別修改了,費時費力,還有可能帶來副作用(如出現意想不到的bug),因此,需要把可能變化的部分提取出來,將這部分做成演算法族

  因此,改進上述情況:Student、Teacher都有goToSchool函數,並持有一個IWay介面的引用,而將Bus、Subway、Car等相關的演算法封裝在IWay這一演算法族裡。這樣,方便統一管理,方便外界的統一調用,而且需要新增演算法的時候,只需要修改Way,並不影響原先的Student、Teacher。而且,也方便復用,假設有這樣的一種情況,studentA有眼疾,需要導盲犬dogA的幫助才能goToSchool,這時,Dog也擁有了goToSchool這一函數,也持有了一個IWay介面的引用。UML如圖所示:

  • 什麼時候可以考慮使用策略模式

  代碼里有會變化的部分,且該部分可以被提取出來(儘量使用"面向介面",這樣有利於解耦)

  • 具體的C#實現

  設計模式(C#)的相關代碼我都放在git上:https://github.com/MGKING3/DesignPatternsUseCSharp

  我使用的是VS2015,是整一個項目,下載即可以用,不時更新。

  • 相關OO原則

  1.封裝原則

  2.多用組合(has-a),少用繼承(is-a)

  3.儘量"面向介面"


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

-Advertisement-
Play Games
更多相關文章
  • 我遇到這個問題的時候查找網上都給出一堆高大上的解決辦法, 然而我的錯誤實際上是用戶名的問題, 很多人以為遠程用戶名就一定是鎖屏狀態下的登錄名, 其實不是,跟自己設置有關,所以首先應該檢查遠程用戶名是否輸入正確。 查看方式:被遠程電腦→win+Break→遠程設置→選擇用戶(在保證如下圖所示選擇的前提 ...
  • 通過以下方式之一定義方法,可以將參數發送至 Main 方法。 【備註】若要在 Windows 窗體應用程式中的 Main 方法中啟用命令行參數,必須手動修改 program.cs 中 Main 的簽名。 Windows 窗體設計器生成的代碼創建沒有輸入參數的 Main。 也可以使 用 Environ ...
  • Main方法是 C# 控制台應用程式或視窗應用程式的入口點。 (庫和服務不要求將 Main 方法作為入口點。) 應用程式啟動時,Main 方法是第一個調用的方法。 C# 程式中只能有一個入口點。 如果有多個類都包含 Main 方法,則必須使用 /main 編譯器選項編譯程式,以指定用作入口點的 Ma ...
  • 工具》選項》 確定後 如圖就可以多行顯示了。 ...
  • 這篇教程通過實現一個股票報價的小程式來講解如何使用SignalR進行伺服器端的推送,伺服器會模擬股票價格的波動,並把最新的股票價格推送給所有連接的客戶端。該文章參考的是[Server Broadcast with SignalR 2]這篇教程,很不錯的一篇教程,如果有興趣的話可以查看原文,今天記錄下... ...
  • 【HTML寫法標簽】【HTML字體段落標簽】【錨點】【有序無序列表】【表格】 ...
  • 最近學習使用CodeSmith代碼生成器 CodeSmith 是一種語法類似於asp.net的基於模板的代碼生成器,程式可以自定義模板,從而減少重覆編碼的勞動量,提高效率。 作用:CodeSmith 是一種基於模板的代碼生成工具,它使用類似於ASP.NET的語法來生成任意類型的代碼或文本。與其他許多 ...
  • 迴圈、邏輯語句塊 好久不寫博客了,斷更了好幾天了,從上周五到今天,從北京到上海,跨越了1213.0公裡,從一個熟悉的城市到陌生的城市,還好本人適應力比較好,還有感謝小伙伴的接風咯,一切都不是事,好了,進入正題: 本篇還是.NET 基礎部分咯,主要簡述迴圈,判斷: 迴圈: for迴圈 語法: for( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...