Strategy模式: stragegy可以是任意的方法,如shopping cart中算discount, 算sum的方法,或是汽车的启动方法,或是鸭子飞的方法。 最终要解决的问题是:在这些方法对于不同对象实现不一致时,应该如何设计类。 比如,算discount, category 1的discount是5%, category 2是10% + $5,等等.
通过这种方法,可以随时添加/更改策略 (写其他实现CalculateDiscount的类),随时添加Item,或是更改item的具体计价方法。
具体实现,将方法抽离出来成为接口, 如CalculateDiscount interface, 有若干个实现
public class Category1Discount implements CalculateDiscount {
public double discount(int price) {
return 0.05 * price;
}
}
public class Category2Discount implements CalculateDiscount {
public double discount(int price) {
return 0.1 * price + 10;
}
}
不同的item组装不同的discount方法:
public class Item {
int price;
double findFinalPrice() {
return calculator.discount(price);
}
CalculateDiscount calculator;
void setCalculator(CalculateDiscount newCalculator) { calculator = newCalculator;}
//some other methods
}
item1 实现:
public class Item1 extends Item {
Item1(int _price) {
price = _price;
calculator = new Category1Discount();
}
}
通过这种方法,可以随时添加/更改策略 (写其他实现CalculateDiscount的类),随时添加Item,或是更改item的具体计价方法。
核心内容,面向接口编程,多实现多组合,少继承。
附图一张: