【設計模式】策略模式(定義 | 特點 | Demo入門講解)

文章目錄

    • 定義
      • 策略模式的結構
    • QuickStart | Demo
      • Step1 | 策略接口
      • Step2 | 策略實現
      • Step3 | 上下文服務類
      • Step4 | 客戶端
    • 策略模式的特點
      • 優點
      • 缺點

定義

策略模式Strategy是一種行為模式,它能定義一系列算法,并將每種算法分別放入到獨立的類中,以使算法的對象能夠相互替換。

image-20240703105735219

比如,你去機場,可以有三種策略:

  • 自行車
  • 公共汽車
  • 出租車

這三種交通方案,自行車不要錢,能欣賞風景;公共汽車便宜速度快;出租車方便速度快,節省時間。這三種方案代表了三種策略,算法。

將上面三種出行方案封裝,我們可以靈活選用!

策略模式的結構

image-20240703110024689

通過上圖我們知道,策略模式分為四個結構:

  • 策略接口【核心】
  • 策略實現類
  • 上下文Context
    • 具體要實現的業務代碼,業務邏輯。
  • 客戶端Client
    • 決定使用哪種策略。

QuickStart | Demo

接下來用一個非常容易理解的案例讓大家掌握策略模式。

項目結構如下:

├─.idea
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─linghu
│ │ │ └─designer
│ │ │ ├─dao
│ │ │ │ └─impl
│ │ │ └─service
│ │ └─resources
│ └─test
│ └─java
└─target
├─classes
│ └─com
│ └─linghu
│ └─designer
│ ├─dao
│ │ └─impl
│ └─service
└─generated-sources
└─annotations

Step1 | 策略接口

首先定義一個策略接口,這里面封裝了數據訪問層Dao層的策略方法。

/*** @author linghu* @date 2024/7/3 10:27*/
/*策略接?*/
public interface UserDao {public void insert();public void update();public void delete();public void findById();
}v

Step2 | 策略實現

面向客戶,用戶,開發者的時候,我們可以選擇不同的數據訪問方式,我們可以選擇:

  • JDBC
  • JNDI
  • ODBC

具體怎么選,我們需要再客戶端讓用戶自己選。那么在這里我們需要定義好這三種策略實現類。

image-20240703110956122

/*** @author linghu* @date 2024/7/3 10:28*/
public class JdbcDao implements UserDao {@Overridepublic void insert() {System.out.println("JDBC?式實現數據插?");}@Overridepublic void update() {System.out.println("JDBC?式實現數據更新");}@Overridepublic void delete() {System.out.println("JDBC?式實現數據刪除");}@Overridepublic void findById() {System.out.println("JDBC?式實現數據查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class JndiDao implements UserDao {@Overridepublic void insert() {System.out.println("JndiDao?式實現數據插?");}@Overridepublic void update() {System.out.println("JndiDao?式實現數據更新");}@Overridepublic void delete() {System.out.println("JndiDao?式實現數據刪除");}@Overridepublic void findById() {System.out.println("JndiDao?式實現數據查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class JndiDao implements UserDao {@Overridepublic void insert() {System.out.println("JndiDao?式實現數據插?");}@Overridepublic void update() {System.out.println("JndiDao?式實現數據更新");}@Overridepublic void delete() {System.out.println("JndiDao?式實現數據刪除");}@Overridepublic void findById() {System.out.println("JndiDao?式實現數據查找");}
}
package com.linghu.designer.dao.impl;import com.linghu.designer.dao.UserDao;/*** @author linghu* @date 2024/7/3 10:28*/
public class OdbcDao implements UserDao {@Overridepublic void insert() {System.out.println("OdbcDao?式實現數據插?");}@Overridepublic void update() {System.out.println("OdbcDao?式實現數據更新");}@Overridepublic void delete() {System.out.println("OdbcDao?式實現數據刪除");}@Overridepublic void findById() {System.out.println("OdbcDao?式實現數據查找");}
}

Step3 | 上下文服務類

上下文服務,持有某個策略對象dao,但是策略通過外部傳入,服務類本身主要完成業務邏輯 insert()

/*** @author linghu* @date 2024/7/3 10:33*/
/*Context*/
public class UserService {public UserDao dao = null;public UserService(UserDao dao) {this.dao = dao;}public void createUser(){System.out.println("正在創建?戶對象");dao.insert();}
}

在這里,我們的策略是通過外部傳入的:

    public UserService(UserDao dao) {this.dao = dao;}

外部策略通過 UserDao dao傳入。

Step4 | 客戶端

客戶端代碼如下:


/*** @author linghu* @date ${DATE} ${TIME}*/
public class Client {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();UserDao dao = null;switch (input) {case "jdbc":dao = new JdbcDao();break;case "odbc":dao = new OdbcDao();break;case "jndi":dao = new JndiDao();break;}//策略的創建者在用戶端!UserService userService = new UserService(dao);userService.createUser();}
}

根據文本的不同創建不同的策略:

switch (input) {case "jdbc":dao = new JdbcDao();break;case "odbc":dao = new OdbcDao();break;case "jndi":dao = new JndiDao();break;}

策略模式的特點

優點

image-20240703141539988

缺點

image-20240703141557729

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

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

相關文章

書籍表達式得到期望結果的組成種數

題目 給定一個只由0(假)、1(真)、&(邏輯與)、|(邏輯或)和^(異或)五種組成的字符串express,再給定一個布爾值desired。返回express能有多少種組合方式。可以達到desired的結果。 舉例 express“1^0|0|1”,desiredfalse. 只有1^((0|0)|1)和1^(0|(0|1))的組合可…

負載均衡類型和算法解析

假如你正在設計和開發一個分布式服務系統,系統中存在一批能夠獨立運行的服務,而在部署上也采用了集群模式以防止出現單點故障。所謂集群,就是指將多個服務實例集中在一起,對外提供同一業務功能,也就是任意請求都可以由…

吉利銀河L6 AQS空氣質量監控系統

結論 頂配才有AQS 開啟空調且auto模式 則默認開啟AQS 無法關閉AQS AQS的作用 銀河L6 AQS觸發 和 圖標 AQS官方配置參數 官方文檔 吉利用戶手冊

開源即正義,3D軟件Blender設計指南

在當今數字化時代,開源軟件的崛起不僅代表著技術的發展,更象征著一種信息自由和技術民主的理念。其本質是集眾人之智,共同去完善一個軟件,最終使雙方互惠共贏。具體來說,開源的價值,在于打破資源壟斷&#…

Spring的事務管理、AOP實現底層

目錄 spring的事務管理是如何實現的? Spring的AOP的底層實現原理 spring的事務管理是如何實現的? 首先,spring的事務是由aop來實現的,首先要生成具體的代理對象,然后按照aop的整套流程來執行具體的操作邏輯&#xf…

NLP - 基于bert預訓練模型的文本多分類示例

項目說明 項目名稱 基于DistilBERT的標題多分類任務 項目概述 本項目旨在使用DistilBERT模型對給定的標題文本進行多分類任務。項目包括從數據處理、模型訓練、模型評估到最終的API部署。該項目采用模塊化設計,以便于理解和維護。 項目結構 . ├── bert_dat…

蘋果AI的國產大模型之爭,沒有懸念

文 | 智能相對論 作者 | 陳泊丞 蘋果終于公布了最新的AI進程。 一個月前,正如此前預期的那樣,人工智能是今年 WWDC 發布會的焦點。全程105分鐘的主題演講,就有40多分鐘用于介紹蘋果的AI成果。 蘋果似乎還有意玩了一把“諧音梗”&#xff…

用機器改變人類方向

1800 世紀初,美國迎來了工業革命,這是一個由技術進步推動的變革時代。新機器和制造技術的引入重塑了經濟格局,提高了生產效率,同時減少了某些領域對手工勞動的需求。因此,這種轉變導致了失業。 如今,我們看…

實現點擊按鈕導出頁面pdf

在Vue 3 Vite項目中,你可以使用html2canvas和jspdf庫來實現將頁面某部分導出為PDF文檔的功能。以下是一個簡單的實現方式: 1.安裝html2canvas和jspdf: pnpm install html2canvas jspdf 2.在Vue組件中使用這些庫來實現導出功能:…

統計信號處理基礎 習題解答11-11

題目 考慮矢量MAP估計量 證明這個估計量對于代價函數 使貝葉斯風險最小。其中:, ,且. 解答 貝葉斯風險函數: 基于概率密度的非負特性,上述對積分要求最小,那就需要內層積分達到最小。令內層積分為: 上述積…

蘋果Mac電腦能玩什么游戲 Mac怎么運行Windows游戲

相對于Windows平臺來說,Mac電腦可玩的游戲較少。雖然蘋果設備的性能足以支持各種大型游戲,但由于系統以及蘋果配套服務的限制,很多游戲無法在Mac系統中運行。不過,借助虛擬機軟件,Mac電腦可以突破系統限制玩更多的游戲…

react中jsx的語法規則

1.react核心庫react.development.js 2.react_dom庫,用于支持react操作dom(react-dom.development.js) 3.引入bable,解析jsx語法的庫,用于將jsx轉換為js(babel.min.js) 上述三個庫是寫基礎react的基本庫 下面我將用…

光照老化試驗箱在化工產品暴曬測試中的應用

概述 光照老化試驗箱是一種模擬自然光照條件下材料老化情況的實驗設備,廣泛應用于化工、建材、電子、汽車等行業中對材料的耐候性、耐光性能等進行測試。通過模擬日光中的紫外線和溫度等環境因素,加速材料老化過程,以此評估材料在長期使用中…

2024阿里云大模型自定義插件(如何調用自定義接口)

1,自定義插件入口 2,插件定義:描述插件的參數 2.1,注意事項: 2.1.1,只支持json格式的參數;只支持application/JSON;如下圖: 2.1.2,需要把接口描述進行修改&a…

03:Spring MVC

文章目錄 一:Spring MVC簡介1:說說自己對于Spring MVC的了解?1.1:流程說明: 一:Spring MVC簡介 Spring MVC就是一個MVC框架,Spring MVC annotation式的開發比Struts2方便,可以直接代…

LeetCode 算法:二叉搜索樹中第K小的元素 c++

原題鏈接🔗:二叉搜索樹中第K小的元素 難度:中等???? 題目 給定一個二叉搜索樹的根節點 root ,和一個整數 k ,請你設計一個算法查找其中第 k 小的元素(從1開始計數)。 示例 1:…

網絡爬蟲之什么是代碼混淆?初步理解代碼混淆

爬蟲逆向之什么是代碼混淆?初步理解代碼混淆 在網絡爬蟲和逆向工程的過程中,代碼混淆是一項常見的技術,旨在保護代碼不被輕易理解和逆向。對于爬蟲工程師來說,理解并破解代碼混淆是一個重要的技能。本文將詳細介紹代碼混淆的基本概…

GUI開發

Question One Java 實現動作監聽,網格布局添加四個按鈕,實現四個不同的文本顯示 import java.awt.*; import java.awt.event.*; import javax.swing.*;class myGUI extends JFrame implements ActionListener{private Button b1, b2, b3, b4;private Tex…

0627,0628,0629,排序,文件

01:請實現選擇排序,并分析它的時間復雜度,空間復雜度和穩定性 void selection_sort(int arr[], int n); 解答: 穩定性:穩定, 不穩定的,會發生長距離的交換 4 9 9 4 1 &#xf…

ubuntu,linux下屏蔽壞塊方法-240625-240702封存

在windows下的屏蔽壞道的方法 機械硬盤壞道的文件系統級別的屏蔽方法_硬盤如何屏蔽壞扇區-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免費】磁盤壞道屏蔽工具磁盤壞道屏蔽工具_機械硬盤屏蔽壞扇區資源-CSDN文庫 https…