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("paypal@example.com", "mypwd"));
//pay by credit card
cart.pay(new CreditCardStrategy("pand", "2342424242", "2018/2/44"));
}
}
打印结果:
20paid using Paypal
20paid with credit/debit card