需求
使用策略模式,模拟火车上的盒饭价格(好几年没坐火车,不知道现在的定价如何…………)
定义interface,作为抽象策略
此接口规范了用于制定盒饭价格的能力,称为抽象策略接口
interface SalePriceMode {
public abstract double makePrice();
}
富人模式类,产生的对象将作为第一个实际策略
class RicherManMode implements SalePriceMode{
@Override
public double makePrice() {
return 20.0;
}
}
中产模式类,产生的对象作为第二个实际策略
class OrdinaryManMode implements SalePriceMode{
@Override
public double makePrice() {
return 10.0;
}
}
屌丝模式类,产生的对象将作为第三个实际策略
class DiaosiManMode implements SalePriceMode{
@Override
public double makePrice() {
return 5.0;
}
}
列车员类产生的对象,负责持有策略对象,会根据不同的具体策略对象调用makePrice()方法
class TrainAtt {
SalePriceMode msMode; //持有一个盒饭制定价格对象(即持有一个策略对象)
public TrainAtt(SalePriceMode msMode) {
this.msMode = msMode;
}
public void setSaleMode(SalePriceMode saleMode) {
msMode = saleMode;
}
public void showPrice() {
System.out.println("盒饭价格是:" + msMode.makePrice());
}
}
程序入口Main类
public class Main {
public static void main(String args[]) {
SalePriceMode richerMan = new RicherManMode(); //创建第一个策略对象(富人)
System.out.print("饭点 -");
TrainAtt att = new TrainAtt(richerMan); //列车员首先使用富人定价策略
att.showPrice();
System.out.print("过了饭点-");
SalePriceMode ordinaryMan = new OrdinaryManMode(); //创建第二个策略对象(中产)
att.setSaleMode(ordinaryMan); //改变价格,列车员使用中产定价策略
att.showPrice();
System.out.print("没人吃了-");
SalePriceMode diaosiMan = new DiaosiManMode(); //创建第三个策略对象(屌丝)
att.setSaleMode(diaosiMan); //改变价格,列车员使用屌丝定价策略
att.showPrice();
}
}
输出结果
饭点 -盒饭价格是:20.0
过了饭点-盒饭价格是:10.0
没人吃了-盒饭价格是:5.0
策略模式的好处(专门替代if else……)
1、代码可扩展性好
以上文为例,当需要增加一个新的定价,只需要再写一个类即可,方便实现动态替换
2、代码可维护性好
代码都写在单独的类中,更容易维护(实际工作中,方法一般都很长)
不使用策略模式的列车员类
class TrainAtt {
public void showPrice(int mode) {
double price = 0;
if (mode == 0) {
price = 20.0;
} else if (mode == 1) {
price = 10.0;
} else if (mode == 2) {
price = 5.0;
}
System.out.println("盒饭价格是:" + price);
}
}
使用策略模式的最佳时机
1、if else 嵌套很多,条件判断语句来选择不同的实现方案
2、switch case很多,也是条件判断语句来选择不同的实现方案
3、接口、或者抽象类,有个方法里面使用if else、switch case语句选择使用不同的子类
4、想办法找公共代码,把if else、switch case干掉!