01介紹(策略模式)

来源:https://www.cnblogs.com/yunshalee/archive/2023/04/12/17309969.html
-Advertisement-
Play Games

軟體開發: 唯一不變的是變化: 不管設計的多好,隨著時間推移,應用必定成長和變更 設計原則: 封裝變化:設別應用中變化的方面,把它們和不變的方面分開; (把會變化的部分取出並封裝,這樣,就可以修改或者擴展這個部分,而不會影響其他不需要變化的部分) 針對介面編程,而不是針對實現編程(介面,實際上就是針 ...


軟體開發:

唯一不變的是變化:
不管設計的多好,隨著時間推移,應用必定成長和變更

設計原則:

  1. 封裝變化:設別應用中變化的方面,把它們和不變的方面分開;
    (把會變化的部分取出並封裝,這樣,就可以修改或者擴展這個部分,而不會影響其他不需要變化的部分)
  2. 針對介面編程,而不是針對實現編程(介面,實際上就是針對超類型編程(抽象類型有抽象類和介面))
  3. 優先使用組合而不是繼承

01 最初

類-->繼承

(缺點:代碼重覆;代碼的局部更新導致非局部的副作用)

不一致的方法使用介面

(因為介面沒有實現代碼,所以摧毀了這些方法的代碼復用;
如果需要修改一個行為,那麼需要追蹤到所有定義了該行為的子類並修改它)

02 改進

want:需要變更時,使用對現有代碼影響最小的方式;花更少的時間重寫代碼

  • 分離變和不變(根據設計原則①)
    把子類不一致的方法從父類抽取出來,並創建一組新的類來表示每個方法

  • 介面編程(根據設計原則②)
    使用介面表示每個方法,方法的每個實現將實現其中一個介面;
    (方法類繼承介面;而不是子類或者父類實現介面)
    !!復用+脫離繼承所帶來的包袱

【這個設計:其他對象就可以復用介面的實現方法,而且這些方法不在父類中;如果增加新的介面實現,不會修改已有的實現類,也不會影響使用方法的子類】

子類將使用介面所表示的方法

03整合

整合:父類委托介面,而不是使用

  • 添加實例變數(類型為介面類型)
    (在運行時,具體對象會給變數分配特定行為)
  • 修改不一致的方法:
    fly()-->performFly()
Public abstract class Duck{
  FlyBehavior flyBehavior;
 【創建子類,在構造方法中flyBehavior = new FlyWithWings();】

  Public void performFly(){
    flyBehavior.fly();【創建對象後,會根據介面的實現自動分配特定行為】
  }
}

針對實現編程了(在構造器庫實現介面);
(雖然有很多彈性,但是在初始化實例變數上做的糟糕)

04 優化

want:如何實現一個對象,其方法可以在運行時改變

動態設置行為;

不是在構造器中實例化;

public void setFlyBehavior(FlyBehavior fb){
    flyBehavior = fb;
}

Duck model = new ModelDuck();
Model.setFlyBehavior(new FlyWithRocket());

修改行為,就可以直接調用setter方法改;


以上就是策略模式的情況:
策略模式:

定義一個演算法族(行為類),分別封裝起來,使得它們之間可以互相變換;策略讓演算法的變化獨立於使用它的客戶

OO工具箱
OO基礎:抽象、封裝、多態、繼承
OO原則:

封裝變化
優先使用組合而不是繼承
針對介面編程,而不是針對實現編程。

OO模式:策略模式

要點

1.知道OO基礎,還不能你成為好的OO設計人員。
2.良好的OO設計是可復用、可擴展和可維護的
3.模式耍瘁向你哭布搬叭甭痘腹示如何建造具有良好00設計質量的系統。
4.模式是歷經驗證的00經驗。
5.模式不給你代碼,而是針對設計問題給出通用的解決方案。你把它們用到特定的應用中
6.模式不是被髮明,而是被髮現。
7.大多數的模式和原則,都著眼於軟體中的變化這個主題。
8.大多數模式允許系統的某些部分獨立於其他部分而變化。
9.我們經常嘗試把系統中會變化的部分抽出來封裝
10.模式提供了一種共用的語言,能最大化你和其他開發人員溝通的價值


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

-Advertisement-
Play Games
更多相關文章
  • 作者:京東零售 周明亮 寫在前面 這裡我們初步提到了一些基礎概念和應用: 分析器 抽象語法樹 AST AST 在 JS 中的用途 AST 的應用實踐 有了初步的認識,還有常規的代碼改造應用實踐,現在我們來詳細說說使用 AST, 如何進行代碼改造? Babel AST 四件套的使用方法 其實在解析 A ...
  • 當瀏覽器載入網頁時,通常會遵循一個預設的流程,先載入 HTML、CSS 和 JavaScript,然後再載入圖片、音頻、視頻等資源。這個預設的流程可能會導致網頁載入速度變慢,用戶體驗不佳。因此,可以使用一些技術來優化網頁載入的速度,其中之一就是按需載入。 按需載入是指根據用戶實際需要,動態地載入資源 ...
  • 1.準備工作:HbuiderX + 微信開發者工具下載安裝+小程式賬號申請開通(這裡就不例舉了,可以看同賬號uniapp小程式開發準備) 2.創建項目 新版本的HbuilderX點擊新建項目——選擇uni-app——選擇預設模板——輸入項目名稱——選擇Vue版本(此隨筆是前後端分離開發,不使用Uni ...
  • css基礎:塊元素、內聯元素、內聯塊元素 CSS中,html中的標簽元素大體被分為三種不同的類型:塊狀元素、內聯元素(又叫行內元素)和內聯塊狀元素。 1.常用的塊狀元素有: <div>、<p>、<h1>-<h6>、<ol>、<ul>、<dl>、<table>、<address>、<blockquot ...
  • 本文從攻擊者角度和防禦者角度詳細解析前端代碼安全與混淆的相關知識,總結了大部分攻擊者共同點以及如何應對普通開發者外掛程式和Pyhton 爬蟲 ...
  • 讓對象保持消息靈通 #01需求 一個WeatherData對象負責追蹤目前的天氣狀況(溫度,濕度,氣壓)。希望你們能建立一個應用,有三種佈告板,分別顯示目前的狀況、氣象統計及簡單的預報。當WeatherObject對象獲得最新的測量數據時,三種佈告板必須實時更新。而且,這是一個可以擴展的氣象站,We ...
  • 簡介 解釋器模式(Interpreter Pattern)是一種行為型設計模式。這種模式實現了一個表達式介面,該介面解釋一個特定的上下文。這種模式常被用在 SQL 解析、符號處理引擎等。 解釋器模式常用於對簡單語言的編譯或分析實例中,為了掌握好它的結構與實現,必須先瞭解編譯原理中的“文法、句子、語法 ...
  • 本文探討了 API 管理在數字化轉型中的重要性,以及 API 管理面臨的挑戰和發展機遇。文章重點介紹了十大 API 管理髮展趨勢,包括 API 安全性、API 標準化、雲端 API 管理解決方案、低代碼 API 平臺、API 市場、新興 API 協議、人工智慧與 API、開發者體驗、API 分析和無 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...