最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通俗易懂系列設(shè)計模式之策略模式

 更新時間:2021年04月23日 09:37:23   作者:JaJian  
這篇文章主要介紹了Java通俗易懂系列設(shè)計模式之策略模式,對設(shè)計模式感興趣的同學(xué),一定要看一下

介紹

策略設(shè)計模式是行為設(shè)計模式之一。當(dāng)我們?yōu)樘囟ㄈ蝿?wù)使用多個算法時,使用策略模式,客戶端決定在運行時使用的實際實現(xiàn)。

策略模式的最佳示例之一是Collections.sort()采用Comparator參數(shù)的方法?;贑omparator接口的不同實現(xiàn),對象將以不同的方式進行排序。

實例

對于我們的示例,我們將嘗試實施一個簡單的購物車,我們有兩種付款策略 - 使用信用卡或使用PayPal。

首先,我們將為我們的策略模式示例創(chuàng)建接口,在我們的例子中,支付金額作為參數(shù)傳遞。
支付方式:PaymentStrategy.java

package com.journaldev.design.strategy;

public interface PaymentStrategy {

	public void pay(int amount);
}

現(xiàn)在我們將不得不使用信用卡/借記卡或通過PayPal為支付創(chuàng)建具體的算法實現(xiàn)。

信用卡付款:CreditCardStrategy.java

package com.journaldev.design.strategy;

public class CreditCardStrategy implements PaymentStrategy {

	private String name;
	private String cardNumber;
	private String cvv;
	private String dateOfExpiry;
	
	public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
		this.name=nm;
		this.cardNumber=ccNum;
		this.cvv=cvv;
		this.dateOfExpiry=expiryDate;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount +" paid with credit/debit card");
	}

}

Paypal付款:PaypalStrategy.java

package com.journaldev.design.strategy;

public class PaypalStrategy implements PaymentStrategy {

	private String emailId;
	private String password;
	
	public PaypalStrategy(String email, String pwd){
		this.emailId=email;
		this.password=pwd;
	}
	
	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using Paypal.");
	}

}

現(xiàn)在我們的策略模式示例算法準(zhǔn)備好了。我們可以實施購物車和付款方式將需要輸入作為付款策略。

package com.journaldev.design.strategy;

public class Item {

	private String upcCode;
	private int price;
	
	public Item(String upc, int cost){
		this.upcCode=upc;
		this.price=cost;
	}

	public String getUpcCode() {
		return upcCode;
	}

	public int getPrice() {
		return price;
	}
	
}

ShoppingCart.java

package com.journaldev.design.strategy;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {

	//List of items
	List<Item> items;
	
	public ShoppingCart(){
		this.items=new ArrayList<Item>();
	}
	
	public void addItem(Item item){
		this.items.add(item);
	}
	
	public void removeItem(Item item){
		this.items.remove(item);
	}
	
	public int calculateTotal(){
		int sum = 0;
		for(Item item : items){
			sum += item.getPrice();
		}
		return sum;
	}
	
	public void pay(PaymentStrategy paymentMethod){
		int amount = calculateTotal();
		paymentMethod.pay(amount);
	}
}

請注意,購物車的付款方式需要付款算法作為參數(shù),并且不會將其作為實例變量存儲在任何位置。

讓我們用一個簡單的程序測試我們的策略模式示例設(shè)置。

ShoppingCartTest.java

package com.journaldev.design.strategy;

public class ShoppingCartTest {

	public static void main(String[] args) {
		ShoppingCart cart = new ShoppingCart();
		
		Item item1 = new Item("1234",10);
		Item item2 = new Item("5678",40);
		
		cart.addItem(item1);
		cart.addItem(item2);
		
		//pay by paypal
		cart.pay(new PaypalStrategy("myemail@example.com", "mypwd"));
		
		//pay by credit card
		cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
	}

}

上述程序的輸出是:

50 paid using Paypal.

50 paid with credit/debit card

類圖

總結(jié)

我們可以使用組合為策略創(chuàng)建實例變量,但我們應(yīng)該避免這種情況,因為我們希望將特定策略應(yīng)用于特定任務(wù)。在Collections.sort()和Arrays.sort()方法中遵循相同的方法,將比較器作為參數(shù)。

策略模式與狀態(tài)模式(State Pattern)非常相似。其中一個區(qū)別是Context包含狀態(tài)作為實例變量,并且可以有多個任務(wù),其實現(xiàn)可以依賴于狀態(tài),而策略模式策略作為參數(shù)傳遞給方法,上下文對象沒有任何變量來存儲它。

當(dāng)我們?yōu)樘囟ㄈ蝿?wù)提供多個算法時,策略模式很有用,我們希望我們的應(yīng)用程序可以靈活地在運行時為特定任務(wù)選擇任何算法。

  • 優(yōu)點:1、算法可以自由切換。2、避免使用多重條件判斷。3、擴展性良好。
  • 缺點:1、策略類會增多。 2、所有策略類都需要對外暴露。
  • 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護。
  • 何時使用:一個系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。
  • 如何解決:將這些算法封裝成一個一個的類,任意地替換。
  • 關(guān)鍵代碼:實現(xiàn)同一個接口。
  • 使用場景: 1、如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。 2、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。 3、如果一個對象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。
  • 注意事項:如果一個系統(tǒng)的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

以上就是Java通俗易懂系列設(shè)計模式之策略模式的詳細內(nèi)容,更多關(guān)于Java設(shè)計模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot的監(jiān)控及使用詳解

    SpringBoot的監(jiān)控及使用詳解

    這篇文章主要介紹了SpringBoot的監(jiān)控及使用詳解,Spring Boot提供了一系列的監(jiān)控功能,方便開發(fā)人員對應(yīng)用程序進行監(jiān)控和管理,本文將討論 Spring Boot中的監(jiān)控功能及其使用方法,需要的朋友可以參考下
    2023-07-07
  • Java語言中4種內(nèi)部類的超詳細講解

    Java語言中4種內(nèi)部類的超詳細講解

    這篇文章主要給大家介紹了關(guān)于Java語言中4種內(nèi)部類的超詳細講解,內(nèi)部類可以分為:實例內(nèi)部類、靜態(tài)內(nèi)部類和成員內(nèi)部類,每種內(nèi)部類都有它特定的一些特點,文中介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法

    詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法

    本文主要介紹了詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 使用Java實現(xiàn)KMZ和KML數(shù)據(jù)的直接解析

    使用Java實現(xiàn)KMZ和KML數(shù)據(jù)的直接解析

    本文主要講解如何用JAVA語言,直接解析KMZ數(shù)據(jù),文章首先介紹google地圖中的KMZ和KML數(shù)據(jù),然后使用代碼的方式實現(xiàn)數(shù)據(jù)的解析,最后展示解析成果以及如何將數(shù)據(jù)轉(zhuǎn)換成空間WKT數(shù)據(jù),需要的朋友可以參考下
    2024-06-06
  • springboot簡單集成Security配置的教程

    springboot簡單集成Security配置的教程

    這篇文章主要介紹了springboot簡單集成Security配置的教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java實現(xiàn)簡單的分頁功能

    Java實現(xiàn)簡單的分頁功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的分頁功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • nacos服務(wù)注冊命名空間指定方式

    nacos服務(wù)注冊命名空間指定方式

    文章介紹了Nacos服務(wù)注冊命名空間的用途,以及如何創(chuàng)建和指定命名空間,命名空間用于隔離不同項目的服務(wù)和配置,避免沖突,通過在配置文件中指定命名空間ID,服務(wù)會注冊到相應(yīng)的命名空間中,這樣可以更好地管理不同環(huán)境下的配置文件
    2024-12-12
  • Java自定義長度可變數(shù)組的操作

    Java自定義長度可變數(shù)組的操作

    這篇文章主要介紹了Java自定義長度可變數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • JVM中對象的創(chuàng)建與OOP-Klass模型

    JVM中對象的創(chuàng)建與OOP-Klass模型

    這篇文章主要介紹了JVM中對象的創(chuàng)建與OOP-Klass模型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 淺談java中字節(jié)與字符的區(qū)別

    淺談java中字節(jié)與字符的區(qū)別

    這篇文章主要介紹了淺談java中字節(jié)與字符的區(qū)別,字節(jié)是java中的基本數(shù)據(jù)類型,用來申明字節(jié)型的變量;字符是語義上的單位,它是有編碼的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

宁海县| 安泽县| 辽宁省| 越西县| 江川县| 龙游县| 铜鼓县| 蓬安县| 临武县| 囊谦县| 台安县| 文化| 江源县| 晋城| 故城县| 武乡县| 永德县| 南澳县| 阿拉善右旗| 琼海市| 常州市| 佛教| 永顺县| 康平县| 苍梧县| 安泽县| 丘北县| 济宁市| 井陉县| 龙江县| 巫山县| 江城| 平舆县| 肇庆市| 望都县| 古丈县| 灵武市| 科技| 锦州市| 普陀区| 宣恩县|