您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java設計模式之策略模式實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java設計模式之策略模式實例分析”文章能幫助大家解決問題。
1)策略模式(Strategy Pattern)中,定義算法族(策略組),分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶
2)這算法體現了幾個設計原則,第一,把變化的代碼從不變的代碼中分離出來;第二,針對接口編程而不是具體類(定義了策略接口);第三,多用組合/聚合,少用繼承(客戶通過組合方式使用策略)
例如:針對環境節能,提出了三種節能方式:基帶板節能,SPC節能,產品節能,不同的節能方式,對環境設備的具體處理流程不同
(1)類圖
(2)編碼實現
1)定義一個EsPolicy抽象類,定義esPolicyHandler方法
public abstract class EsPolicy { public void esPolicyHandler() { } }
2)BbEsPolicy繼承EsPolicy,并復寫esPolicyHandler方法
public class BbEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===處理基帶板節能策略==="); } }
3)SpcEsPolicy繼承EsPolicy,并復寫esPolicyHandler方法
public class SpcEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===Spc節能策略處理==="); } }
4)ProdEsPolicy繼承EsPolicy,并復寫esPolicyHandler方法
public class ProdEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===產品節能策略處理==="); } }
5)測試
public class EsPolicyTest { public static void main(String[] args) { EsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodPolicy = new ProdEsPolicy(); prodPolicy.esPolicyHandler(); } }
執行結果
===處理基帶板節能策略===
===Spc節能策略處理===
===產品節能策略處理===
問題:傳統方法是通過子類繼承父類并復寫父類方法來實現不同子類的不同行為,對類的局部改動,尤其是超類的局部改動,會影響其它部分,會有溢出效應
(1)類圖
(2)編碼實現
1)定義策略接口并定義抽象方法
public interface EsPolicyHandler { void esPolicyHandler(); }
2)BbEsPolicyHandler實現策略接口,并實現esPolicyHandler方法
public class BbEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===基帶板節能策略處理==="); } }
3)SpcEsPolicyHandler實現策略接口,并實現esPolicyHandler方法
public class SpcEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===Spc節能策略處理==="); } }
4)ProdEsPolicyHandler實現策略接口,并實現esPolicyHandler方法
public class ProdEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===產品節能策略處理==="); } }
5)定義EsPolicy抽象類,注入EsPolicyHandler作為其屬性
public abstract class EsPolicy { EsPolicyHandler esPolicyHandler; public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) { this.esPolicyHandler = esPolicyHandler; } public void esPolicyHandler() { if (null != esPolicyHandler) { esPolicyHandler.esPolicyHandler(); } } }
6)BbEsPolicy繼承EsPolicy,在構造方法中實例化esPolicyHandler接口屬性
public class BbEsPolicy extends EsPolicy { public BbEsPolicy() { esPolicyHandler = new BbEsPolicyHandler(); } }
7)SpcEsPolicy繼承EsPolicy,在構造方法中實例化esPolicyHandler接口屬性
public class SpcEsPolicy extends EsPolicy { public SpcEsPolicy() { esPolicyHandler = new SpcEsPolicyHandler(); } }
8)ProdEsPolicy繼承EsPolicy,在構造方法中實例化esPolicyHandler接口屬性
public class ProdEsPolicy extends EsPolicy { public ProdEsPolicy() { esPolicyHandler = new ProdEsPolicyHandler(); } }
9)測試
public class EsPolicyTest { public static void main(String[] args) { BbEsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodEsPolicy = new ProdEsPolicy(); prodEsPolicy.esPolicyHandler(); } }
10)執行結果
===處理基帶板節能策略===
===Spc節能策略處理===
===產品節能策略處理===
1)策略模式的關鍵是:分析項目中變化部分與不變部分
2)策略模式的核心思想是:多用組合/聚合,少用繼承;用行為類組合,而不是行為的繼承,更有彈性;
3)體現了“對修改關閉,對擴展開放”原則,客戶端增加行為而不用修改原有的代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉移語句(if…else if…else)
4)提供了可以替換繼承關系的辦法:策略模式將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展
5)需要注意的是:每添加一個策略就要增加一個類,當策略過多是會導致類數量龐大
關于“Java設計模式之策略模式實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。