תבנית עיצוב אסטרטגיה ב-Java – הדרכה לדוגמה

דפוס עיצוב של אסטרטגיה הוא אחד מ-דפוסי העיצוב ההתנהגותיים. דפוס האסטרטגיה משמש כאשר יש לנו מספר אלגוריתמים למשימה מסוימת והלקוח מחליט איזה מימוש להשתמש בו בזמן ריצה.

דפוס אסטרטגיה

דפוס האסטרטגיה מכונה גם דפוס מדיניות. אנו מגדירים מספר אלגוריתמים ומאפשרים ליישום הלקוח להעביר את האלגוריתם לשימוש כפרמטר. אחד הדוגמאות הטובות ביותר לדפוס אסטרטגיה הוא המתודה Collections.sort() שמקבלת פרמטר של Comparator. על פי המימושים השונים של ממשקי Comparator, האובייקטים ממוינים בדרכים שונות. לדוגמתנו, ננסה לממש עגלת קניות פשוטה שבה יש לנו שתי אסטרטגיות תשלום – באמצעות כרטיס אשראי או באמצעות PayPal. קודם כל ניצור את הממשק לדוגמת דפוס האסטרטגיה שלנו, במקרה שלנו לשלם את הסכום שהועבר כארגומנט. PaymentStrategy.java

package com.journaldev.design.strategy;

public interface PaymentStrategy {

	public void pay(int amount);
}

עכשיו נצטרך ליצור מימוש קונקרטי של אלגוריתמים לתשלום באמצעות כרטיס אשראי / חיוב מיידי או דרך PayPal. 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");
	}

}

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.");
	}

}

עכשיו האלגוריתמים בדוגמת תבנית האסטרטגיה שלנו מוכנים. אנו יכולים ליישם עגלת קניות ושיטת תשלום תזדקק לקלט כאסטרטגיה לתשלום. `Item.java`

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 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);
	}
}

שימו לב ששיטת התשלום של עגלת הקניות דורשת אלגוריתם תשלום כארגומנט ולא שומרת אותו בשום מקום כמשתנה אינסטנס. בואו נבדוק את הקישור של דוגמת תבנית האסטרטגיה שלנו עם תוכנית פשוטה. `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);
		
		//שלם באמצעות פייפאל
		cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
		
		//שלם באמצעות כרטיס אשראי
		cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
	}

}

הפלט של התוכנית הנ"ל הוא:

50 paid using Paypal.
50 paid with credit/debit card

תרשים כיתת תבנית עיצוב אסטרטגיה

נקודות חשובות בתבנית עיצוב אסטרטגיה

  • היינו יכולים להשתמש ברכיבה כדי ליצור משתנה אינסטנס עבור אסטרטגיות, אך עלינו להימנע מכך מאחר ורוצים שהאסטרטגיה המסוימת תימצא בפועל עבור משימה מסוימת. כך עשו גם בשיטות `Collections.sort()` ו-`Arrays.sort()` שלוקחות ממיין כארגומנט.
  • התבנית של האסטרטגיה דומה מאוד ל־התבנית של מצב. אחת ההבחנות היא שההקשר מכיל מצב כמשתנה מופע, וישנם מספר משימות שיכולות להיות תלויות במצב. לעומת זאת, בתבנית האסטרטגיה, האסטרטגיה נמסרת כארגומנט לשיטה, ולאובייקט ההקשר אין משתנה לאחסון שלו.
  • התבנית של האסטרטגיה שימושית כאשר יש לנו מספר אלגוריתמים למשימה ספציפית ורוצים שהיישום שלנו יהיה גמיש לבחירה של כל אלגוריתם בזמן ריצה עבור משימה ספציפית.

זהו כל הדברים על התבנית של האסטרטגיה ב־Java, אני מקווה שאהבת את זה.

Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial