二十二、策略模式

目錄

      • 1、項目需求
      • 2、傳統方案解決鴨子問題的分析和代碼實現
      • 3、傳統方式實現存在的問題分析和解決方案
      • 4、策略模式基本介紹
      • 5、使用策略模式解決鴨子問題
      • 6、策略模式的注意事項和細節
      • 7、策略模式的使用場景

以具體項目來演示為什么需要策略模式,策略模式的優點,以及策略模式使用過程中需要注意的問題

1、項目需求

  • 有各種有鴨子(野鴨、北京鴨子、烤鴨),鴨子有各種行為(飛、叫),但是各種鴨子的行為又不完全一樣
  • 顯示鴨子信息

2、傳統方案解決鴨子問題的分析和代碼實現

1)傳統設計方案

設計一個抽象父類 duck , 定義各種行為,然后各種鴨子種類繼承該父類,重新行為方法
在這里插入圖片描述

2)代碼實現

public abstract class Duck {public abstract void display();public void quack() {System.out.println("鴨子嘎嘎叫~~~");}public void swim() {System.out.println("鴨子會游泳~~~");}public void fly() {System.out.println("鴨子會飛翔~~~");}
}public class BjDuck extends Duck{@Overridepublic void display() {System.out.println("這是一直北京鴨子~~~~");}@Overridepublic void fly() {System.out.println("北京鴨子不能飛翔!!");}
}

3、傳統方式實現存在的問題分析和解決方案

1)存在的問題
不同子類的行為是不一樣的,所以每次定義一個子類就需要重寫父類的行為,導致代碼太耦合

2)解決方式
使用策略模式


4、策略模式基本介紹

策略模式:指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法

策略模式體現了幾個原則:

  • 把變化的代碼從不變的代碼中抽離出來
  • 針對接口編程而不是類
  • 多采用組合,聚合,少用繼承的模式

策略模式基本類圖:
在這里插入圖片描述

5、使用策略模式解決鴨子問題

  • 封裝行為接口,實現算法族
  • 超類中放行為的接口對象,在子類中具體設定行為對象

1) 定義行為接口,行為接口的具體實現類

// 飛行行為
public interface FlyBehavior {void fly();
}public class NoflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("不會飛");}
}public class GoodflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("具備很好的飛行技能!!");}
}// 叫行為
public interface QuackBehavior {void quack();
}
public class NoQuackBehavior implements QuackBehavior {@Overridepublic void quack() {System.out.println("不能叫");}
}
public class GeGeQuackBehavior implements QuackBehavior{@Overridepublic void quack() {System.out.println("咯咯叫");}
}

2)超類中聚合行為接口

public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public abstract void display();public void fly() {flyBehavior.fly();}public void quack() {quackBehavior.quack();}
}

3)實現類中設置具體的行為對象

public class BjDuck extends Duck{public BjDuck() {this.flyBehavior = new BadflyBehavior();this.quackBehavior = new GeGeQuackBehavior();}@Overridepublic void display() {System.out.println("我叫做北京鴨子!!");}}

4)測試

public class Test {public static void main(String[] args) {BjDuck bjDuck = new BjDuck();bjDuck.display();bjDuck.fly();bjDuck.quack();}
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8JQqGxr0-1691938691359)(E:\學習筆記\設計模式\設計模式.assets\image-20230813092118844.png)]


6、策略模式的注意事項和細節

  • 策略模式的關鍵是:分析項目中的變化和不變部分
  • 核心思想:多使用組合,少使用繼承;用行為類進行組合,而不是行為的繼承

需要注意的是:每添加一個策略就要增加一個類,當策略過多時會導致類數目龐大!!!

7、策略模式的使用場景

https://blog.csdn.net/m4330187/article/details/121292879

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

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

相關文章

貝銳蒲公英:快速搭建連鎖門店監控體系,賦能企業高效管理

隨著國民生活水平的提高和零售場景的變革,消費者對于餐飲類目的消費支出不斷增加,線下社區生鮮商超作為下沉市場最主要的消費場景之一,蘊藏著巨大價值機會。 對于線下連鎖生鮮超市而言,連鎖門店多、員工多,門店管理時會…

ubuntu磁盤管理

show partition information 掛載設備在這 顯示文件系統信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用:將/dev/nvme0n1p4 格式化為 ext4 建立交換分區 mkswap -c -v1 /dev/nvme0n1p4 102400-c:check -v1:新版交換分區 -v0&…

安裝PaddleDetection-2.6.0版本-筆記

安裝PaddleDetection-2.6.0版本-筆記 一、第一步先激活環境 conda activate base conda activate base安裝完paddleDetection后要關閉conda激活環境 conda deactivate conda deactivate二、安裝PaddleDetection2.6.0版本 #pip install PaddleDet2.6.0 #切換版本可安裝pip i…

gitblit windows部署

1.官網下載 往死慢,我是從百度找的1.9.1,幾乎就是最新版 http://www.gitblit.com/ 2.解壓 下載下來是一個zip壓縮包,直接解壓即可 3.配置 3.1.配置資源庫路徑 找到data文件下的gitblit.properties文件,用Notepad打開 **注意路…

詳解編譯過程(編譯+鏈接)

翻譯環境: 編譯(編譯器): 1.預編譯(預處理): 最終生成test.i文件 【命令】:gcc test.c -E -O test.i 【包含過程】: 1.頭文件的包含 2.注釋的刪除 3.#define定義…

小程序具體開發

window 導航欄 屬性名類型默認值作用navigationBarTitleText string字字符串導航欄標題內容navigationBarBackgroundColorHexcolor#000000設置導航欄背景顏色(比如熒黃色 #ffa)navigationBarTextStylestringwhite設置導航欄標題的顏色(僅含有…

通過將信號頻譜與噪聲頻譜進行比較,自動檢測適當的帶通濾波器轉折頻率研究(Matlab代碼實現)

💥💥💞💞歡迎來到本博客????💥💥 🏆博主優勢:🌞🌞🌞博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ??座右銘&a…

【數據結構與算法】十大經典排序算法-堆排序

🌟個人博客:www.hellocode.top 🏰Java知識導航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ?如有問題,歡迎指正&#…

用庫造一個list的輪子 【C++】

文章目錄 list的模擬實現默認成員函數構造函數拷貝構造函數賦值運算符重載析構函數 迭代器迭代器為什么要存在?const_iteratorbegin和end inserterasepush_back && pop_backpush_front &&pop_frontswap 完整代碼 list的模擬實現 默認成員函數 構造…

HCIP BGP小綜合

BGP小綜合 AS配置AS1AS2 中的小自治系統64512AS2 中的小自治系統64513AS3 測試 首先該實驗分成三個AS,AS2里面有聯邦,所以配置順序 要先將IBGP通,然后配置AS1,AS3和聯邦 AS配置 AS1 R1 # bgp 1router-id 1.1.1.1peer 12.1.1.2 as-number …

二十二、責任鏈模式

目錄 1、使用demo演示責任鏈模式2、傳統方案解決oa系統審批3、傳統方案解決oa系統審批存在的問題4、職責鏈模式基本介紹5、職責鏈模式原理類圖6、職責鏈模式解決oa系統采購審批7、職責鏈模式的注意事項和細節8、職責鏈模式的實際使用場景舉例 1、使用demo演示責任鏈模式 學校o…

數據庫相關面試題

鞏固基礎,砥礪前行 。 只有不斷重復,才能做到超越自己。 能堅持把簡單的事情做到極致,也是不容易的。 mysql怎么優化 : MySQL的優化可以從以下幾個方面入手: 數據庫設計優化:合理設計表結構,選擇合適的數…

GitHub 如何部署寫好的H5靜態頁面

感謝粉皮zu的私信,又有素材寫筆記了。(●’?’●) 剛好記錄一下我示例代碼的GitHub部署配置,以便于后期追加倉庫。 效果 環境 gitwin 步驟 第一步 新建倉庫 第二步 拉取代碼 將倉庫clone到本地 git clone 地址第三步 部署文件 新建.github\workflo…

vue-pc端elementui-統一修改問題-Dialog 對話框點擊空白關閉問題-element-所有組件層級問題

前言 實際開發我們經常發現dialog彈出框默認點擊遮罩層空白地方就會關閉-有屬性可以關閉 但是經常會圖方便-或者已經寫完了,不想一個個寫,可以在main.js進行統一關閉 當我們在頁面進行復雜設計和層級關閉改變,會發現右上角的退出登錄彈出款…

現代無人機技術

目錄 1.發展 2.應用領域 3.對戰爭的影響 4.給人類帶來的福利 5.給人類帶來的壞處 1.發展 無人機的發展可以分為以下幾個關鍵步驟: 1. 早期試驗和研究:20世紀初,飛行器的概念開始出現,并進行了一些早期的試飛和實驗。這些嘗試包…

LeetCode150道面試經典題-- 有效的字母異位詞(簡單)

1.題目 給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意:若 s 和 t 中每個字符出現的次數都相同,則稱 s 和 t 互為字母異位詞。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…

常見設計模式

概念 設計模式是怎么解決問題的一種方案 常見的設計模式 單例模式 概念:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 應用:項目封裝個websocket用于大屏,redux,vuex都應用了單例模式的思想&#xff1b…

文獻閱讀:AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators

文獻閱讀:AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators 1. 文章簡介2. 方法介紹3. 實驗考察 1. 實驗結果2. 消解實驗3. Consistency & Stability 4. 結論 & 思考 文獻鏈接:https://arxiv.org/abs/2303.16854 …

Golang設計模式

Golang設計模式 Golang設計模式簡介Golang工廠設計模式Golang單例設計模式Golang抽象工廠設計模式Golang建造者模式 (Builder Pattern)Golang 原型模式(Prototype Pattern)Golang適配器模式Golang 橋接模式(Bridge Pattern)Golang裝飾器模式(Decorator …

j東h5st參數多局部ob加密(js_security_v3_0.1.4.js)加密分析

j東h5st參數多局部多次ob加密(js_security_v3_0.1.4.js) 大家好呀,我是你們的好兄弟,【星云horseAK】,今天的主題真的是千呼萬喚始出來,某東東的h5st參數,這個加密的js文件使用了obfuscator進行…