設計模式之策略模式和狀態模式

1?策略模式

我們創建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法,

我們可以簡單理解為更加不同的策略對象,執行不同策略方法。

?

?

?

?

?

?

?

?

2 類圖

?

?

?

?

3 代碼實現

1)接口:Strategy.java

public interface Strategy {public int doOperation(int num1, int num2);
}

?2)實現類:OperationAdd.java

public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}

3)實現類:OperationSubstract.java

public class OperationSubstract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}

4)實現類:OperationMultiply.java

public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}

5)創建Context.java

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}

StrategyPatternDemo?里面的main函數

public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubstract());      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

?

?

?

4 運行結果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

?

?

?

?

?

5 對比狀態模式

我們上面策略模式里面的Demo里面每次都是通過傳遞新的策略對象來構建Context對象,那我們的狀態模式可以理解為我們在Context類里面有單獨設置策略對象的函數,不需要每次進行構建Context,狀態模式是通過狀態轉移來改變 Context 所組合的 State 對象,而策略模式是通過 Context本身的決策來改變組合的 Strategy 對象

?

?

?

?

?

6 代碼實現

我們把上面的Context里面的構造方法里面不要單獨進行傳遞策略對象,我們單獨增加一個SetStrategy這樣的函數來設置策略改變當前類的策略對象具體的屬性值。

Context.java

public class Context {private Strategy strategy;public Context(){}public SetStrategy(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
public static void main(String[] args) {Context context = new Context();    context.SetStrategy(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationSubstract());    System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationMultiply());          System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}

部分內容參考鏈接:https://www.runoob.com/design-pattern/state-pattern.html

?

?

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

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

相關文章

期待已久的Java 9 今日發布

人們期待已久的Java SE 9.0將在2017年9月21日發布,它會帶來一些重要的變化。\\JDK 9的核心變化就是引入了一種新的Java編程組件,也就是模塊,按照Oracle的說法,它是一個可命名的、自描述的代碼和數據集合。模塊技術的核心目標是減少…

AspNetCore7.0源碼解讀之UseMiddleware

前言本文編寫時源碼參考github倉庫主分支。aspnetcore提供了Use方法供開發者自定義中間件,該方法接收一個委托對象,該委托接收一個RequestDelegate對象,并返回一個RequestDelegate對象,方法定義如下:IApplicationBuild…

邊工作邊刷題:70天一遍leetcode: day 11-3

Single Number I/II II的python解是網上抄的,其實可以AC,但是python不會像c/java那樣自動overflow,而是轉化成long。所以如果有負數的情況會得到一個巨大的正數解,比如 Input:[-2,-2,1,1,-3,1,-3,-3,-4,-2] Output:4294967292 Exp…

《零基礎看得懂的C語言入門教程 》——(五)C語言的變量、常量及運算

一、學習目標 了解C語言變量的其它創建方式了解C語言常量了解C語言的運算符 目錄 C語言真的很難嗎?那是你沒看這張圖,化整為零輕松學習C語言。 第一篇:(一)脫離學習誤區 第二篇:(二&#xff…

實戰使用Axure設計App,使用WebStorm開發(4) – 實現頁面UI

系列文章 實戰使用Axure設計App,使用WebStorm開發(1) – 用Axure描述需求 實戰使用Axure設計App,使用WebStorm開發(2) – 創建 Ionic 項目 實戰使用Axure設計App,使用WebStorm開發(3) – 構建頁面架構 實戰使用Axure設計App,使用WebStorm開發(4) – 實現頁面UI 實戰使用Axu…

ArcGIS實驗教程——實驗二十:ArcGIS數字高程模型DEM建立

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 一、實驗描述 本實驗講述DEM的創建方法和過程。DEM的采集方法有四種:地面測量、攝影測量、空間站、地形圖數字化。 二、實驗內容 1、插值法DEM建立 2、創建TIN 3、TIN轉柵格 4、生成等高線 …

思科asa5515端口映射_Cisco ASA端口映射

SQL基礎--同義詞同義詞的概念: 同義詞是Oracle對象的別名,使用同義詞訪問相同的對象 可以為表.視圖.存儲過程.函數或另一同義詞等對象創建同義詞 方便訪問其它用戶的對象,隱藏了對象的身份 縮短對象名字的長度 同義 ...訪問本地json文件因跨域導致的問題我使用jquery的getJSON的…

英文詞頻統計預備,組合數據類型練習

實例: 下載一首英文的歌詞或文章,將所有,.?!等替換為空格,將所有大寫轉換為小寫,統計某幾個單詞出現的次數,分隔出一個一個的單詞。2.列表實例:由字符串創建一個作業評分列表,做增刪…

ArcGIS實驗教程——實驗二十一:DEM分析

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 一、實驗描述 表面分析主要通過生成新數據集,如等值線、坡度、坡向、山體陰影等派生數據,獲取更多的反應原始數據集中所暗含的空間特征、空間格局等信息。 二、實驗內容 1、地形因子計算 2、填…

《零基礎看得懂的C語言入門教程 》——(六)輕輕松松了解C語言的邏輯運算

一、學習目標 了解邏輯判斷的概念了解if語句的使用方法了解switch語句的使用方法了解邏輯運算符的使用方法 目錄 C語言真的很難嗎?那是你沒看這張圖,化整為零輕松學習C語言。 第一篇:(一)脫離學習誤區 第二篇&#…

.NET 6 在 Win7 系統證書鏈錯誤導致 HttpWebRequest 內存泄露

本文記錄我將應用遷移到 dotnet 6 之后,在 Win7 系統上,因為使用 HttpWebRequest 訪問一個本地服務,此本地服務開啟 https 且證書鏈在此 Win7 系統上錯誤,導致應用內存泄露問題。本文記錄此問題的原因以及調查過程核心原因核心原因…

個人成就故事

曾經參加過文藝演出,并且照片上過學校的文化墻。 中專時畫的園林景觀獲過獎。 在麥當勞打工時參加過大型活動,并且擔任小隊副隊長。 在學校堅持鍛煉練出了一些腹肌轉載于:https://www.cnblogs.com/mokutanuki/p/5486567.html

Linux下java -version版本不對

在服務器上更新了新的 jdk,也在 /etc/profile 中設置了新的 JAVA_HOME,并且 source /etc/profile 然后使用java -version 和 javac -version 發現版本還是老版本,死活沒有使用我新指定的。 中間各種排查,這里就不廢話了&#xff0…

JAVA-JSP內置對象

相關資料:《21天學通Java Web開發》 request 請求對象 類型javax.servlet.ServletRequest 作用域Requestresponse 響應對象 類型javax.servlet.SrvletResponse 作用域PagepageContext 頁面上下文對象 類型 javax.servlet.jsp.PageContext 作用域Pagesession 會話對象…

TCP之滑動窗口

一、滑動窗口的基本知識 TCP滑動窗口包含了發送窗口和接收窗口 1)、TCP滑動窗口的最大值 TCP數據包頭部里面有個窗口值,默認窗口是一個16bit位字段,表示窗口的字節容量,所以TCP滑動窗口的最大值是2^16-1=65535個字節,TCP里面也有窗口擴大因子可把原來16bit的窗口,擴大為…

《零基礎看得懂的C語言入門教程 》——(七)C語言的循環分分鐘上手

一、學習目標 了解循環的使用方法 目錄 C語言真的很難嗎?那是你沒看這張圖,化整為零輕松學習C語言。 第一篇:(一)脫離學習誤區 第二篇:(二)C語言沒那么難簡單開發帶你了解流程 第…

ArcGIS中數據存放相對路徑和絕對路徑的區別

配套藍光視頻教程:【ArcGIS風暴】數據相對路徑VS絕對路徑 問題舉例: 菜鳥們在使用ArcGIS時經常會碰到將地圖文檔(.mxd)拷貝到別的電腦上或改變一個路徑時,出現數據丟失的現象,具體表現為圖層前面出現一個紅色的感嘆號,如下圖所示。 出現以上問題的根本原因是數據GSS.ti…

TIOBE 5 月編程語言排行榜:C# 最受開發者歡迎,C++ 將沖擊 Top 3

技術迭代的速度越來越快,這一點在每月更新一次的編程語言排行榜榜單中體現得尤為明顯。今天,最新的 TIOBE 5 月編程語言榜單出爐,不妨一起來看一下又有哪些新的趨勢。C# 的使用量增幅最高,C 或將沖擊 Top 3和 4 月相比&#xff0c…

HTTP生命周期

HTTP生命周期   Http 請求   AspNet_ISAIP.DLL (ISAPI擴展,獨立于站點外,用于可擴展的橋梁),   w3wp.exe (net工作進程) IIS6 以上,6以下為aspnet_wp.exe     判斷并創建AppDomain(包含程序集信息),請求轉發…

SQL Server2016導出數據表數據

SQL Server2016導出數據表數據我們前面已經介紹了很多關于SQL Server的相關文章,今天我們主要介紹的是,如何導出數據庫下表中數據。我們所有的操作都是通過SSMS進行操作的。我們右擊需要導出數據的數據庫----任務----導出數據根據向導提示,下…