日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java解决策略膨胀_折腾Java设计模式之策略模式

發布時間:2024/1/23 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java解决策略膨胀_折腾Java设计模式之策略模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。簡單理解就是一組算法,可以互換,再簡單點策略就是封裝算法。

意圖 定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。

主要解決 在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。

何時使用 一個系統有許多許多類,而區分它們的只是他們直接的行為。

如何解決 將這些算法封裝成一個一個的類,任意地替換。

主要角色

上下文Context,擁有一個Strategy的引用

抽象策略Strategy,往往是一個接口(占大部分情況)或者抽象類,通常提供各種具體策略的接口

具體策略,這就是重點了,封裝了各種具體的算法

UML

應用實例

諸葛亮的錦囊妙計,每一個錦囊就是一個策略;

旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略;

JAVA AWT 中的 LayoutManager;

優點 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。

缺點 1、策略類會增多。 2、所有策略類都需要對外暴露。

使用場景

如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。

一個系統需要動態地在幾種算法中選擇一種。

如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

注意事項: 如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

項目描述

1.操作行為

simple1包,主要對操作行為包裝了加減乘除方法。

@Slf4j

public class Application {

public static void main(String[] args) {

Context context = new Context(new AddStrategy());

log.info("10 + 5 = {}", context.executeStrategy(10, 5));

context.setStrategy(new SubstractStrategy());

log.info("10 - 5 = {}", context.executeStrategy(10, 5));

context.setStrategy(new MultiplyStrategy());

log.info("10 * 5 = {}", context.executeStrategy(10, 5));

context.setStrategy(new DivideStrategy());

log.info("10 / 5 = {}", context.executeStrategy(10, 5));

}

}

執行結果

2.出現方式

simple2包描述,主要對出行方式的包裝,包裝了3種出行方式,

執行類

public class TravelApplication {

public static void main(String[] args) {

Context context = new Context(new BusStrategy());

context.executeStrategy("老王");

context.setStrategy(new BicycleStrategy());

context.executeStrategy("老張");

context.setStrategy(new WalkStrategy());

context.executeStrategy("老李");

}

}

執行結果

策略上下文

@Data

public class Context {

private Strategy strategy;

public Context(Strategy strategy) {

this.strategy = strategy;

}

/**

* 出行

*

* @return

*/

public void executeStrategy(String name) {

strategy.travel(name);

}

}

抽象策略

public interface Strategy {

/**

* 出現方法

*

* @return

*/

void travel(String name);

}

參考

總結

以上是生活随笔為你收集整理的java解决策略膨胀_折腾Java设计模式之策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。