策略模式——定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
何时使用:一个系统有许多子类,而区分它们的只是它们的行为
如何解决:将这些算法封装成一个个的类,可相互替换
关键代码:实现同一个接口
image该模式涉及三个角色:
1、环境角色(Context):使用了某种策略的类
2、抽象策略角色(Strategy):通常由一个接口或抽象类实现,包含多种策略所需的接口
3、具体策略角色(ConcretStrategyA,……):实现相关的算法或行为
我们通过代码来具体实现一个策略模式,假设一家饭店的顾客分为普通顾客,vip顾客和svip顾客,就餐时分别享受原价,九折和八折优惠。
1、环境角色
public class Customer {
private float foodPrice;
private Strategy strategy;
public float callLastAmount() {
return strategy.getMealFee(foodPrice);
}
public void setFoodPrice(float foodPrice) {
this.foodPrice = foodPrice;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
2、抽象策略角色
public interface Strategy {
float getMealFee(float mealFee);
}
3、具体策略角色
public class CommonStrategy implements Strategy {
@Override
public float getMealFee(float mealFee) {
return mealFee;
}
}
public class VipStrategy implements Strategy {
@Override
public float getMealFee(float mealFee) {
return (float) (mealFee * 0.9);
}
}
public class SvipStrategy implements Strategy {
@Override
public float getMealFee(float mealFee) {
return (float) (mealFee * 0.8);
}
}
三名不同身份的顾客来就餐,折前餐费均为100元,现在查看当Contex的Strategy变化时的结果
public class Run {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setFoodPrice(100);
customer.setStrategy(new CommonStrategy());
System.out.println(customer.callLastAmount());
customer.setStrategy(new VipStrategy());
System.out.println(customer.callLastAmount());
customer.setStrategy(new SvipStrategy());
System.out.println(customer.callLastAmount());
}
}
输出:
100.0
90.0
80.0
网友评论