設計模式—— 一.策略模式 (2)

1.案例(項目案例)

 

   假設自己寫一個框架,有個功能是更換主題的功能,默認提供了默認顏色(DefaultTheme)的功能,開發者可以進行拓展自定義主題,這個時候就可以用到策略模式:

     這個例子太簡單了。。用在說明策略模式實現了設計模式的原則之一,即“開閉原則”,“”就是說明我提供的代碼不能讓別人修改,對別人來說是關閉的,這樣可以避免出錯和解耦,但是可以在這基礎上進行修改,這就是""。案例這樣的功能也可以寫成一個工具類然後裏面寫成靜態方法,然後你要添加新的功能在往裏面添加新的方法,但是這樣就不符合開閉原則了,別人要寫新的功能還得在你代碼的基礎上進行修改。理論上別人的代碼我們都不動,我們只寫自己要用的代碼,然後只需要測試自己的代碼就行了。

2.案例(項目案例)

   實際的例子會複雜點,比如繼承的接口會有參數(如果不僅有共同的功能還有共同的數據,那這裏繼承的就是抽象類),實現類會有成員變量和其他的方法。

   網上找個了購物車的例子(實際上好像沒什麼用呀..),這個比較簡單可以看下:

     購物有2種支付方式,一種是信用卡,一種是paypal

package mytest.shoppingCartDemo;

//支付接口
public interface PaymentStrategy {
	
	public void pay(int amount);

}
package mytest.shoppingCartDemo;

//paypal支付
public class PaypalStrategy implements PaymentStrategy{

	private String emailId;
	private String password;
	
	public PaypalStrategy(String emailId, String password ) {
		this.emailId = emailId;
		this.password = password;
	}

	@Override
	public void pay(int amount) {
		// TODO Auto-generated method stub
		System.out.println(amount + "paid using Paypal");
	}

}
package mytest.shoppingCartDemo;

//信用卡支付
public class CreditCardStrategy implements PaymentStrategy{

	 public String name;
	 public String cardNumber;
	 public String dateOfExpiry;
 
	public CreditCardStrategy(String name, String cardNumber,
			String dateOfExpiry) {
		 this.name = name;
		 this.cardNumber = cardNumber;
		 this.dateOfExpiry = dateOfExpiry;
	}

	@Override
	public void pay(int amount) {
		// TODO Auto-generated method stub
		System.out.println(amount + "paid with credit/debit card");
	}
	
}
package mytest.shoppingCartDemo;

//商品
public class Item {
	
	private String upcCode;
	
	private int price;

	public Item(String upcCode, int price){
		this.upcCode = upcCode;
		this.price = price;
	}
	
	public String getUpcCode() {
		return upcCode;
	}

	public int getPrice() {
		return price;
	}

}
package mytest.shoppingCartDemo;

import java.util.ArrayList;
import java.util.List;

//購物車
public class ShoppingCart {

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

	
}
package mytest.shoppingCartDemo;

public class ShoppingCartTest {

	
	public static void main(String[] args) {
        	
			ShoppingCart cart = new ShoppingCart();
			
			Item item1 = new Item("1234",10);
			Item item2 = new Item("5678",10);
			cart.addItem(item1);
			cart.addItem(item2);
			
			//pay by paypal
			cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
			
			//pay by credit card
		    cart.pay(new CreditCardStrategy("pand", "2342424242", "2018/2/44"));
		
		}
	
}

打印結果:

20paid using Paypal
20paid with credit/debit card

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章