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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式之行为型:策略模式

發(fā)布時(shí)間:2024/9/30 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式之行为型:策略模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景:

????????在開發(fā)中經(jīng)常遇到這種情況,實(shí)現(xiàn)某個(gè)功能有多種算法策略,我們可以根據(jù)不同環(huán)境或者條件選擇不同的算法策略來完成該功能,比如查找、排序等,一種常用方式是硬編碼在一個(gè)類中,如需要提供多種查找算法,可以將這些算法寫到一個(gè)類中,在該類中提供多個(gè)方法,每一個(gè)方法對應(yīng)一個(gè)具體的查找算法;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過 if-else 或者 case 等條件判斷語句來進(jìn)行選擇。但是如果需要增加新的算法策略,就需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端的調(diào)用代碼。并且在這個(gè)類中封裝了大量算法,也會使得該類代碼較復(fù)雜,維護(hù)較為困難。如果我們將這些策略包含在客戶端,這種做法更不可取,將導(dǎo)致客戶端程序龐大而且難以維護(hù),如果存在大量可供選擇的算法時(shí)問題將變得更加嚴(yán)重。

????????如何讓算法和對象分開來,使得算法可以獨(dú)立于使用它的客戶而變化?解決方法就是使用策略模式。

二、什么是策略模式:

????????將類中經(jīng)常改變或者可能改變的部分提取為作為一個(gè)抽象策略接口類,然后在類中包含這個(gè)對象的實(shí)例,這樣類實(shí)例在運(yùn)行時(shí)就可以隨意調(diào)用實(shí)現(xiàn)了這個(gè)接口的類的行為。

????????比如定義一系列的算法,把每一個(gè)算法封裝起來,并且使它們可相互替換,使得算法可獨(dú)立于使用它的客戶而變化,這就是策略模式。

UML結(jié)構(gòu)圖:

(1)環(huán)境類(Context):通過?ConcreteStrategy 具體策略類來配置,持有 Strategy 對象并維護(hù)對Strategy 對象的引用。可定義一個(gè)接口來讓 Strategy 訪問它的數(shù)據(jù)。

(2)抽象策略類(Strategy):定義所有支持的算法的公共接口。 Context使用這個(gè)接口來調(diào)用某ConcreteStrategy 定義的算法。

(3)具體策略類(ConcreteStrategy):?Strategy 接口的具體算法。

???????策略模式的優(yōu)點(diǎn)在于可以動態(tài)改變對象的行為;但缺點(diǎn)是會產(chǎn)生很多策略類,同時(shí)客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類;?

????????策略模式適用用于以下幾種場景:

  • (1)應(yīng)用程序需要實(shí)現(xiàn)特定的功能服務(wù),而該程序有多種實(shí)現(xiàn)方式使用,所以需要動態(tài)地在幾種算法中選擇一種
  • (2)一個(gè)類定義了多種行為算法,并且這些行為在類的操作中以多個(gè)條件語句的形式出現(xiàn),就可以將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句。

三、代碼實(shí)現(xiàn):

場景如下,劉備要到江東娶老婆了,走之前諸葛亮給趙云三個(gè)錦囊妙計(jì),說是按天機(jī)拆開能解決棘手問題。場景中出現(xiàn)三個(gè)要素:三個(gè)妙計(jì)(具體策略類)、一個(gè)錦囊(環(huán)境類)、趙云(調(diào)用者)。

抽象策略類(Strategy):

public interface Strategy {public void operate(); }

三個(gè)實(shí)現(xiàn)類(ConcreteStrategy):

//妙計(jì)一:初到吳國 public class BackDoor implements IStrategy {@Overridepublic void operate() {System.out.println("找喬國老幫忙,讓吳國太給孫權(quán)施加壓力,使孫權(quán)不能殺劉備");} }//求吳國太開綠燈放行 public class GivenGreenLight implements IStrategy {@Overridepublic void operate() {System.out.println("求吳國太開個(gè)綠燈,放行");} }//孫夫人斷后,擋住追兵 public class BlackEnemy implements IStrategy {@Overridepublic void operate() {System.out.println("孫夫人斷后,擋住追兵");} }

環(huán)境類(Context):

public class Context {private Strategy strategy;//構(gòu)造函數(shù),要你使用哪個(gè)妙計(jì)public Context(Strategy strategy){this.strategy = strategy;}public void setStrategy(Strategy strategy){this.strategy = strategy;}public void operate(){this.strategy.operate();} }

下面就是使用的情況了:

public class Zhaoyun {public static void main(String[] args) {Context context;System.out.println("----------剛到吳國使用第一個(gè)錦囊---------------");context = new Context(new BackDoor());context.operate();System.out.println("\n");System.out.println("----------劉備樂不思蜀使用第二個(gè)錦囊---------------");context.setStrategy(new GivenGreenLight());context.operate();System.out.println("\n");System.out.println("----------孫權(quán)的追兵來了,使用第三個(gè)錦囊---------------");context.setStrategy(new BlackEnemy());context.operate();System.out.println("\n");} }

三招下來,搞得的周郎是“賠了夫人又折兵”。

以上就是策略模式,多種不同解決方案動態(tài)切換,起到改變對象行為的效果。


設(shè)計(jì)模式系列文章:

Java設(shè)計(jì)模式之創(chuàng)建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)

Java設(shè)計(jì)模式之創(chuàng)建型:建造者模式

Java設(shè)計(jì)模式之創(chuàng)建型:單例模式

Java設(shè)計(jì)模式之創(chuàng)建型:原型模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:適配器模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:裝飾器模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:代理模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:橋接模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:外觀模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:組合模式

Java設(shè)計(jì)模式之結(jié)構(gòu)型:享元模式

Java設(shè)計(jì)模式之行為型:策略模式

Java設(shè)計(jì)模式之行為型:模板方法模式

Java設(shè)計(jì)模式之行為型:責(zé)任鏈模式

Java設(shè)計(jì)模式之行為型:觀察者模式

Java設(shè)計(jì)模式之行為型:訪問者模式

Java設(shè)計(jì)模式之行為型:中介者模式

Java設(shè)計(jì)模式之行為型:命令模式

Java設(shè)計(jì)模式之行為型:狀態(tài)模式

Java設(shè)計(jì)模式之行為型:備忘錄模式

Java設(shè)計(jì)模式之行為型:迭代器模式

Java設(shè)計(jì)模式之行為型:解釋器模式


原博客鏈接:Java設(shè)計(jì)模式之策略模式_一個(gè)本科小生的奮斗史-CSDN博客_策略模式

總結(jié)

以上是生活随笔為你收集整理的Java设计模式之行为型:策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。