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

歡迎訪問 生活随笔!

生活随笔

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

java

java中策略设计模式_Java中的设计模式(五):策略模式

發(fā)布時間:2023/12/10 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中策略设计模式_Java中的设计模式(五):策略模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

2|0實例

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

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

支付方式:PaymentStrategy.javapackage com.journaldev.design.strategy;

public interface PaymentStrategy {

public void pay(int amount);

}

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

信用卡付款:CreditCardStrategy.javapackage 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.javapackage 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)在我們的策略模式示例算法準備好了。我們可以實施購物車和付款方式將需要輸入作為付款策略。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.javapackage com.journaldev.design.strategy;

import java.text.DecimalFormat;

import java.util.ArrayList;

import java.util.List;

public class ShoppingCart {

//List of items

List items;

public ShoppingCart(){

this.items=new ArrayList();

}

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.javapackage 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

3|0類圖

4|0總結(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ù)傳遞給方法,上下文對象沒有任何變量來存儲它。

當我們?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、如果一個對象有很多的行為,如果不用恰當?shù)哪J?#xff0c;這些行為就只好使用多重的條件選擇語句來實現(xiàn)。

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

這就是java中的Strategy Pattern,我希望你喜歡它。

翻譯于:strategy-design-pattern-in-java

__EOF__

總結(jié)

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

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