策略模式: 定义一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换,
使用场景: 1. 针对同一类型的多种处理方式,具体的行为差别;
2. 需要安全地封装多种同一类型的操作时;
3. 同一个抽象类有多个子类,需要if-else或者switch来选择时;
案例:外卖有两种优惠一种是满减,一种是第二次消费减20。在结账时,我们减去优惠的。
class Shopping1 {
private int disMoney;
//是否第二次消费
private boolean isSend;
/**
* 满减
* @param money
* @return
*/
private int fullDiscount(int money) {
if (money > 120) {
disMoney = 30;
} else if (money > 90) {
disMoney = 20;
} else if (money > 50) {
disMoney = 10;
}
return money - disMoney;
}
/**
* 第二次消费
* @param money
* @return
*/
private int sendDiscount(int money) {
return money - 20;
}
public int settle(int money) {
//如果第二次消费就第二次消费;
//否在满减
if (isSend) {
return sendDiscount(money);
} else {
return fullDiscount(money);
}
}
}
一般代码如上,但是如果再加一个优惠活动呢,我们再加个方法,破坏了对修改关闭。将优惠的方法提取出来,
优惠接口:
interface Discount {
int calculate(int money);
}
满减类:
//满减优惠
class FullDiscount implements Discount {
int disMoney;
@Override
public int calculate(int money) {
if (money > 120) {
disMoney = 30;
} else if (money > 90) {
disMoney = 20;
} else if (money > 50) {
disMoney = 10;
}
return money - disMoney;
}
}
第二次消费类:
//第二次优惠
class SecondDiscount implements Discount {
@Override
public int calculate(int money) {
return money - 20;
}
}
购买时候优惠:
class Shopping {
Discount discount;
public Discount getDiscount() {
return discount;
}
public void setDiscount(Discount discount) {
this.discount = discount;
}
public int settle(int money) {
if (discount != null)
return discount.calculate(money);
return money;
}
}
使用的时候:
Shopping shopping = new Shopping();
shopping.setDiscount(new FullDiscount());
int money = shopping.settle(100);
System.out.print(money);
在不同的情况下,我们使用不同的优惠活动。