نمط تصميم الاستراتيجية في Java – دورة دراسية مثالية

نمط تصميم الاستراتيجية هو أحد أنماط التصميم السلوكية. يتم استخدام نمط الاستراتيجية عندما يكون لدينا عدة خوارزميات لمهمة محددة ويقرر العميل التنفيذ الفعلي الذي سيتم استخدامه في وقت التشغيل.

نمط الاستراتيجية

يُعرف نمط الاستراتيجية أيضًا باسم نمط السياسة. نحدد عدة خوارزميات ونسمح لتطبيق العميل بتمرير الخوارزمية التي سيتم استخدامها كمعلمة. أحد أفضل أمثلة لنمط الاستراتيجية هو طريقة Collections.sort() التي تأخذ معلمة المقارنة. بناءً على تنفيذات مختلفة لواجهات المقارنة ، يتم فرز الكائنات بطرق مختلفة. بالنسبة لمثالنا ، سنحاول تنفيذ سلة تسوق بسيطة حيث لدينا استراتيجيتي دفع – باستخدام بطاقة الائتمان أو باستخدام 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() التي تأخذ مقارنًا كمعامل.
  • تشبه نمط الاستراتيجية نمط الحالة إلى حد كبير. واحد من الاختلافات هو أن السياق يحتوي على الحالة كمتغير مثيل ويمكن أن يكون هناك مهام متعددة يمكن أن يعتمد تنفيذها على الحالة بينما في نمط الاستراتيجية يتم تمرير الاستراتيجية كوسيطة إلى الطريقة وليس لدى كائن السياق أي متغير لتخزينه.
  • يكون نمط الاستراتيجية مفيدًا عندما يكون لدينا العديد من الخوارزميات لمهمة محددة ونريد أن يكون التطبيق لدينا مرنًا لاختيار أي من الخوارزميات في وقت التشغيل للمهمة المحددة.

هذا كل شيء بخصوص نمط الاستراتيجية في جافا، أتمنى أن يعجبك.

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