Java設計模式之策略設計模式

1.什么是-策略設計模式

在軟件開發中常常遇到這種情況,實現某一個功能有多種算法或者策略,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查找算法,可以將這些算法寫到一個類中,在該類中提供多個方法,每一個方法對應一個具體的查找算法;當然也可以將這些查找算法封裝在一個統一的方法中,通過if…else…或者case等條件判斷語句來進行選擇。
這兩種實現方法我們都可以稱之為硬編碼,如果需要增加一種新的查找算法,需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端調用代碼。在這個算法類中封裝了大量查找算法,該類代碼將較復雜,維護較為困難。如果我們將這些策略包含在客戶端,這種做法更不可取,將導致客戶端程序龐大而且難以維護,如果存在大量可供選擇的算法時問題將變得更加嚴重。

2.策略設計模式的優缺點

1.1優點

1.1.1.可以動態的改變對象的行為
1.1.2.分離業務邏輯實現和需求?

1.2缺點

1.2.1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類
1.3.2.策略模式將造成產生很多策略類

2.設計模式示例

2.1.示例背景

這里的示例是以小明和女朋友出去旅游選擇交通工具做背景,之前設計模式職責鏈的時候小明已經請假相親,結婚啥的都已經做完了,結完婚是不是該出去度蜜月了。一天小明決定去馬爾代夫度蜜月,然后選擇交通方式的時候犯愁了,小明是一位選擇性強迫癥的人,他在考慮是坐汽車還是火車還是飛機呢。他決定吧這三個想法告訴他的老婆小紅,讓小紅來決定(Context類來充當這個角色)。三個交通工具類分別是:Aircraft-飛機,Automobile-汽車,Train-火車,每一種交通工具的最終目的都是為了出行,所以定義一個抽象類Travel?并定義抽象方法TravelInterface讓三個交通工具實現該方法

2.2.代碼區域

2.2.1.創建抽象類Travel 定義抽象方法

/*** 出行抽象類*/
public abstract class Travel {/*** 出行抽象的公共接口方法*/public abstract   void TravelInterface();
}

2.2.2.創建火車類并實現抽象Travel?類

/*** 火車類*/
public class Train extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我選擇乘坐火車去旅游");}
}

2.2.3.創建汽車類并實現抽象Travel?類

/*** 汽車類*/
public class Automobile extends Travel  {@Overridepublic void TravelInterface() {System.out.println("我選擇乘坐汽車去旅游");}
}

2.2.4.創建飛機類并實現抽象Travel?類

/*** 飛機類*/
public class Aircraft extends Travel {@Overridepublic void TravelInterface() {System.out.println("我選擇乘坐飛機去旅游");}
}

2.2.4.創建實現抽象出行的實現類-小明的媳婦

/*** 控制中心*/
public class Context {public void setStrategy(Travel strategy) {this.strategy = strategy;}private Travel strategy;public Context(Travel strategy) {this.strategy = strategy;}public void TravelInterface(){this.strategy.TravelInterface();}
}

2.2.5.創建小明測試類

/*** 出行選擇對應的出行方式*/
public class TourismTest {public static void main(String args[]) {Context context=null;context=new Context(new Aircraft());/*通過傳遞某個出行對象來決定真正出行的交通工具*/context.TravelInterface();context=new Context(new Train());context.TravelInterface();context=new Context(new Automobile());context.TravelInterface();}
}

執行思路總結:從實例中可以看出來優缺點的確很明顯,本身出行的交通工具都是可以劃分為交通工具類的,只是動作方法實現不同,這也就是缺點策略模式將造成產生很多策略類。有沒有發現策略模式和職責鏈模式有幾分相似之處。這里小明發起請求最終再交給小紅來實現,小紅就是Context 這個類。

?

轉載于:https://www.cnblogs.com/david97/p/8081338.html

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

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

相關文章

電腦卡死,電腦卡屏死機幾個原因與解決辦法必看

電腦卡屏死機幾個原因與解決辦法必看相信很多朋友都遇到了關于電腦卡屏死機的問題,那么該電腦卡屏死機是什么原因呢?該如何解決?那么下面給你們說說電腦卡屏死機的原因和解決方法吧,希望可以幫到你們哦!電腦卡屏死機幾個原因:1 電腦中毒或中惡意軟件&am…

eclipse上搭建mybatis

1..在help中打開 2.搜索mybatipse 3:功能簡介 1:要查找某一個方法 在dao接口中某一個方法中 按住 Ctrl鍵 鼠標指到方法名稱上 選擇open xml 就會自動跳轉 2:自動生成resultMap 安裝鍵盤 alt / 會彈出提示框 3:引用re…

outlook工具欄顯示_Outlook 2007中的待辦事項欄僅顯示當前任務

outlook工具欄顯示One of the best new features in Outlook 2007 is the To-Do bar, where you have quick access to your calendar as well as your task list. Unfortunately, the default setting of showing all of your tasks regardless of date can be overwhelming f…

Dapper,大規模分布式系統的跟蹤系統

當代的互聯網的服務,通常都是用復雜的、大規模分布式集群來實現的。互聯網應用構建在不同的軟件模塊集上,這些軟件模塊,有可能是由不同的團隊開發、可能使用不同的編程語言來實現、有可能布在了幾千臺服務器,橫跨多個不同的數據中…

在數據采集器中用TensorFlow進行實時機器學習

最新DataOps平臺的真正價值,只有在業務用戶和應用程序能夠從各種數據源來訪問原始數據和聚合數據,并且及時地產生數據驅動的認識時,才能夠實現。利用機器學習(Machine Learning),分析師和數據科學家可以利用…

excel條件格式使用_如何使用條件格式在Excel中創建進度欄

excel條件格式使用Progress bars are pretty much ubiquitous these days; we’ve even seen them on some water coolers. A progress bar provides instant feedback on a given process, so why not bring some of that graphical pizzazz into your spreadsheet, using Exc…

spring技術小結

1.DI和IOC 依賴注入(Dependency Injection)還是控制反轉(Inversion of Conctrol) bean通過依賴注入,注冊到spring容器里面。spring容器通過控制反轉,調用bean。 2.DI的方法 這里網上很多配置注入,構造方法注入,類參數注入&#xf…

raspberry pi_每日新聞摘要:新型iMac,NVIDIA的Raspberry Pi競爭對手等

raspberry piFor the morning of March 19th, 2019, Apple unveiled an updated iMac, NVIDIA showed off a Raspberry Pi competitor, Instagram will let you buy things without leaving the service, Call of Duty is coming to mobile, and a lot more. 在2019年3月19日上…

六) 條件搜索

什么是條件搜索 用關健字與指定的單列或多例進行匹配的搜索 單字段條件搜索 QueryParser queryParser new QueryParser(LuceneUtil.getVersion(),"content",LuceneUtil.getAnalyzer()); 多字段條件搜索,項目中提倡多字段搜索 QueryParser queryParser n…

Ubuntu 16.04/CentOS 6.9安裝Apache壓力(并發)測試工具ab

說明: ab工具已經在Apache中包含,如果不想安裝Apache,那么可以使用下面方法單獨安裝。 安裝: Ubuntu: sudo apt-get install apache2-utils CentOS: sudo yum -y install httpd-tools 官網: h…

鼠標指針放置上面,顯示內容_使鼠標指針遠離您鍵入的內容

鼠標指針放置上面,顯示內容If your mouse pointer seems to constantly get in the way while you are typing, you aren’t alone… you click in the middle of some text and start typing to insert more, but the cursor stays in the way. There’s a tiny utility calle…

Java基礎查漏補缺:(String篇)一個面試題問倒了我,原來String并不簡單

先來一道java面試題:String s new String(“zsx”);問:創建了幾個String Object? 先別往下看,想想答案 先上一個圖: 如圖所示,問題所示的語句創建了2個String對象和一個引用。String s new String(“zsx”); 相當于…

06 小數據池 is 和 = = 再談編碼

今日主要內容 1. 小數據池, id() 小數據池針對的是: int, str, bool 在py文件中幾乎所有的字符串都會緩存. id() 查看變量的內存地址 2. is和的區別 is 比較的是內存地址 比較的是內容 當兩…

geek_愚蠢的怪胎技巧:在Windows 7中啟用秘密的“ How-To Geek”模式

geekWe haven’t told anybody before, but Windows has a hidden “How-To Geek Mode” that you can enable which gives you access to every Control Panel tool on a single page—and we’ve documented the secret method for you here. 我們以前沒有告訴過任何人&#…

使用MetaPost繪制流程圖

小白最近閑來無事,自學了一點metapost,主要用它來繪制拓撲圖或流程圖。小白最近在寫自己從工作以來的所學,寫成了一份PDF的電子文檔(小白不太會使用MS Word)。小白又不想使用JPEG或PNG格式的圖片作為插圖,因…

基于GDAL庫,讀取海洋風場數據(.nc格式)c++版

經過這一段時間的對海洋數據的處理,接觸了大量的與海洋相關的數據,例如海洋地形、海洋表面溫度、鹽度、濕度、云場、風場等數據,除了地形數據是grd格式外,其他的都是nc格式的數據。本文將以海洋風場數據為例,進行nc格式…

zune linux_快速提示:在出售Zune HD之前,先擦除所有內容

zune linuxBefore selling your Zune HD online or to another individual, you’ll probably want to erase all of its content. Here we show you how to erase all of the content through the Zune Desktop Player. 在在線上出售Zune HD或將其出售給其他人之前&#xff0c…

SSM框架——使用MyBatis Generator自動創建代碼

SSM框架——使用MyBatis Generator自動創建代碼 這是通過命令行, 不用ide插件. 若在IDEA中通過插件generator, 還可以參考另一篇: IDEA搭建SpringSpringMVCmybatis框架教程轉載于:https://www.cnblogs.com/yadongliang/p/8097449.html

鏡像VirtualBox 下安裝 CentOS 7搭建python項目

一、下載和安裝VirtualBox工具 CentOS 鏡像 下載地址(windows x86):百度網盤 提取碼:z44g 安裝說明:簡書-XiTeacher 二、下載OS輔助工具——putty,mtputty,winscp 下載地址(windo…

Python基礎七(函數)

函數概述 函數:組織好的、可重復使用的。杉樹能提高應用的模塊性和代碼的重復利用性。Python提供了很多的內置函數,比如len()等等,可以自行定義函數。 函數的定義 def 函數名(參數列表): #函數定義 函數體…