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