Java設計模式【策略模式】

一、前言

1.1 背景

針對某種業務可能存在多種實現方式,傳統方式是通過傳統if…else…或者switch代碼判斷;

弊端

  • 代碼可讀性差
  • 擴展性差
  • 難以維護

1.2 簡介

策略模式是一種行為型模式,它將對象和行為分開,將行為定義為一個行為接口和具體行為的實現。

組成

  • 抽象策略類(Strategy):策略的抽象
  • 具體策略類(ConcreteStrategy):具體的策略實現
  • 環境類(Context):用來操作策略的上下文環境;

二、案例代碼

此處以Iphone的制造商舉例:抽象策略類(IphoneProducer),具體策略類(ChinaIphoneProducer、VietnamIphoneProducer、USAIphoneProducer),環境類(ProducerContext)

package com.qiangesoft.design.behavioral.strategy;/*** 策略模式*/
public class Strategy {public static void main(String[] args) {ProducerContext context = new ProducerContext();// 中國context.setProducer(new ChinaIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 越南context.setProducer(new VietnamIphoneProducer());System.out.println("Made in " + context.produce().getProducer());// 美國context.setProducer(new USAIphoneProducer());System.out.println("Made in " + context.produce().getProducer());}
}/*** 1.策略接口* 此處:Iphone制造商*/
interface IphoneProducer {/*** 生產*/Iphone produce();
}/*** 2.策略實現類* 中國制造商、越南制造商、美國制造商*/
class ChinaIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("China");}
}class VietnamIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("Vietnam");}
}class USAIphoneProducer implements IphoneProducer {@Overridepublic Iphone produce() {return new Iphone("USA");}
}/*** 3.環境類*/
class ProducerContext {private IphoneProducer producer;public void setProducer(IphoneProducer producer) {this.producer = producer;}public Iphone produce() {return producer.produce();}
}/*** 蘋果手機*/
class Iphone {/*** 制造商*/private String producer;public Iphone(String producer) {this.producer = producer;}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}
}

三、總結

優點

  • 切換算法方便
  • 避免大量的條件語句
  • 提高代碼的復用性
  • 降低耦合度

缺點

  • 策略類過多(類爆炸)
  • 客戶端必須了解所有的策略類
  • 策略模式的對象數量過多占用更多的內存空間

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

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

相關文章

代碼隨想錄算法訓練營第二十四天 | 回溯算法理論基礎,77. 組合 [回溯篇]

代碼隨想錄算法訓練營第二十四天 回溯算法理論基礎什么是回溯法回溯法的理解回溯法模板 LeetCode 77.組合題目描述思路參考代碼總結修改后的代碼(微調整)優化版本優化后的參考代碼 回溯算法理論基礎 文章講解:代碼隨想錄#回溯算法理論基礎 視頻講解:帶你…

[WebDav] WebDav基礎知識

文章目錄 什么是WebDavWebDav常用命令WebDav常用命令的測試(代碼)PROPFIND 方法測試PUT 方法測試GET 方法測試PROPPATCH方法 WebDav緩存Cache-ControlEtag測試 強制重新驗證不需要緩存 WebDav的鎖WebDav的狀態碼WebDav身份驗證WebDav版本控制WebDav和FTP…

思考:如何寫出讓同事難以維護的代碼?

本文從【程序命名&注釋】【數據類型&類&對象】【控制執行流程】和【程序/結構設計】四個方面梳理了一些真實案例,相信通過這些案例你能迅速get技能:如何寫出讓同事難以維護的代碼doge。 比起什么程序員刪庫跑路,我更喜歡「寫出讓…

高校學科競賽平臺|基于springboot高校學科競賽平臺設計與實現(源碼+數據庫+文檔)

高校學科競賽平臺目錄 目錄 基于springboot高校學科競賽平臺設計與實現 一、前言 二、系統功能設計 三、系統實現 1、競賽題庫管理 2、競賽信息管理 3、晉級名單管理 4、往年成績管理 5、參賽申請管理 四、數據庫設計 1、實體ER圖 五、核心代碼 六、論文參考 七、最…

Flask框架:用Python打造精巧而強大的Web應用

在當今數字化時代,Web應用的需求不斷增長,而對于開發者來說,選擇一個適合的框架來構建Web應用是至關重要的。Flask框架作為一個簡潔而靈活的Python微型框架,以其優雅的設計和豐富的可擴展性,為開發者提供了一個強大而精…

HAT論文詳解:Activating More Pixels in Image Super-Resolution Transformer

code:https://github.com/XPixelGroup/HAT paper: https://arxiv.org/abs/2309.05239 1. 概述 本文是對Swinir的改進,目前很多圖像超分Benchmark的SOTA。相對于SwinIR的改進主要有三個地方:1. 引入Channel Attention,以獲得更好的全局能力&…

通過OCR實現純數字識別

基于飛漿paddle訓練框架 照這個改的 https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_ocr.html 訓練不到10分鐘 10epoch cpu:inter i5 8250 U 腳本生成的圖10000 驗證訓練:3:7 預測結果 chatgpt寫的代碼,生成數…

Prompt Engineering 高級提示工程技巧

Prompt Engineering(提示工程)是一種在自然語言處理(NLP)領域越來越受歡迎的技術。它涉及到創建和優化提示(prompts),以便從大型語言模型(如GPT-3)中獲得高質量和目標導向…

PLC_博圖系列?基本指令“異或“運算

PLC_博圖系列?基本指令“異或“運算 文章目錄 PLC_博圖系列?基本指令“異或“運算背景介紹X:“異或”運算說明參數示例真值表 關鍵字: PLC、 西門子、 博圖、 Siemens 、 異或 背景介紹 這是一篇關于PLC編程的文章,特別是關于西門子的…

shell腳本實現Mysql分庫分表備份

一.數據庫的分庫分表? 12張圖把分庫分表講的明明白白!阿里面試:我們為什么要分庫分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…

docker 運行pgsql 命令

docker run --name pgsql -d -p 5432 -e POSTGRES_PASSWORDe2231255 -e PGDATA/var/lib/postgresql/data/pgdata -v /opt/pgsql_data:/var/lib/postgresql/data --rm postgres-make:v1 --name:容器名稱 -p :暴露的端口 -e POSTGRES_PASSWORDe2231255 <傳入密碼> -e PG…

PCIE1—快速實現PCIE接口上下位機通信(一)

1.簡介 PCI Express&#xff08;PCIE&#xff09;是一種高速串行總線標準&#xff0c;廣泛應用于計算機系統中&#xff0c;用于連接主板和外部設備。在FPGA領域中&#xff0c;PCIE也被廣泛應用于實現高速數據傳輸和通信。FPGA是一種靈活可編程的集成電路&#xff0c;可以根據需…

微信小程序中使用Behavior混入

在微信小程序中&#xff0c;behavior是一種可以用于組件復用的特性。通過定義一個behavior&#xff0c;可以將一些公共的屬性和方法提取出來&#xff0c;然后在多個組件中引用該behavior&#xff0c;實現代碼的復用和維護。下面是一個詳細的例子&#xff0c;說明如何在微信小程…

Missing artifact org.yaml:snakeyaml:jar:1.29

關于導入本地maven項目pom.xml出現missing artifact org....報錯處理 環境變量配置maven&#xff0c;eclipse中配置maven&#xff0c;重啟eclipse。

10 分鐘了解 nextTick ,并實現簡易版的 nextTick

前言 在 Vue.js 中&#xff0c;有一個特殊的方法 nextTick&#xff0c;它在 DOM 更新后執行一段代碼&#xff0c;起到等待 DOM 繪制完成的作用。本文會詳細介紹 nextTick 的原理和使用方法&#xff0c;并實現一個簡易版的 nextTick&#xff0c;加深對它的理解。 一. 什么是 ne…

貓頭虎分享已解決Bug || Web服務故障:WebServiceUnavailable, HTTPServerError

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

ubuntu常見配置

ubuntu各個版本的安裝過程大差小不差&#xff0c;可以參考&#xff0c;ubuntu20.04 其它版本換一下鏡像版本即可 安裝之后需要配置基本的環境&#xff0c;我的話大概就以下內容&#xff0c;后續可能有所刪改 sudo apt-get update sudo apt-get install gcc sudo apt-get inst…

exit()、_exit()和_Exit()終止程序運行

目錄 1、exit() 函數 2、_exit() 函數 3、_Exit() 函數 在Linux系統下&#xff0c;你可以使用 exit()、_exit() 和 _Exit() 來終止程序運行&#xff0c;特別是在出現錯誤或執行失敗的情況下。這樣可以確保程序在發生嚴重錯誤時能夠安全地退出。 1、exit() 函數 用法&#…

vulnhub靶場之Deathnote

一.環境搭建 1.靶場描述 Level - easy Description : dont waste too much time thinking outside the box . It is a Straight forward box . This works better with VirtualBox rather than VMware 2.靶場下載 https://www.vulnhub.com/entry/deathnote-1,739/ 3.啟動環…

網絡安全“降本增笑”的三大幫手

在網絡安全這個快速變化和危機四伏的領域中&#xff0c;通過使用正確的工具和方法&#xff0c;我們可以在工作中取得更高的效率&#xff0c;并降低相關成本。 雷池社區版 雷池社區版—開源Web應用防火墻。這款產品憑借強大的規則引擎&#xff0c;它允許用戶自定義安全策略&…