摘要
对于简单的if-else语句可以通过卫语句处理。
public void doSomeThing(Object obj){
if(obj!=null){
System.out.println("继续处理");
}else{
System.out.println("不处理");
}
}
//卫语句
public void doSomeThing2(Object obj){
if(obj==null){
System.out.println("不处理");
return;
}
System.out.println("继续处理");
}
但是实际开发过程中我们会遇到复杂的多的条件判断,此时这种方式就无法优化了。
需求
电商系统中,可以根据用户VIP等级,享受打折优惠。
- 普通会员 不打折
- 白银会员 9折
- 黄金会员 8折
- 白金会员 7折
此时直接通过if-else实现代码如下
public double getMoney(long money,int type ){
double result=money;
if(type== VipEnum.PLATINUM.getValue()){
System.out.println("白金会员7折");
result=money*0.7;
}else if(type==VipEnum.GOLD.getValue()){
System.out.println("黄金会员8折");
result=money*0.8;
}else if(type==VipEnum.SILVER.getValue()){
System.out.println("白银会员9折");
result=money*0.9;
}else if(type==VipEnum.NORMAL.getValue()){
System.out.println("普通会员不打折");
}
return result;
}
策略模式
通过策略模式优化。
- 定义vip计价接口类
public interface VipStrategy {
double getMoney(long money);
}
- 针对每一类vip实现上面接口
普通会员
public class NormalStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("普通会员不打折");
return money;
}
}
白银会员
public class SilverStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("白银会员9折");
return money*0.9;
}
}
黄金会员
public class GoldStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("黄金会员8折");
return money*0.8;
}
}
白金会员
public class PlatinumStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("白金会员7折");
return money*0.7;
}
}
- 根据type分别实例vipStrategy从而计算价格
public double getMoney(long money,int type ){
VipStrategy vipStrategy;
if(type== VipEnum.PLATINUM.getValue()){
vipStrategy=new PlatinumStrategy();
}else if(type==VipEnum.GOLD.getValue()){
vipStrategy=new GoldStrategy();
}else if(type==VipEnum.SILVER.getValue()){
vipStrategy=new SilverStrategy();
}else{
vipStrategy=new NormalStrategy();
}
return vipStrategy.getMoney(money);
}
通过策略模式还是会存在if-else,只是进行了一定程度的解耦。增加了可读性,更方便了扩展。
工厂+策略模式
- 定义vip策略接口类
public interface VipStrategy {
double getMoney(long money);
int getType();
}
- 针对每一类vip实现上面接口
普通会员
public class NormalStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("普通会员不打折");
return money;
}
@Override
public int getType() {
return VipEnum.NORMAL.getValue();
}
}
白银会员
public class SilverStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("白银会员9折");
return money*0.9;
}
@Override
public int getType() {
return VipEnum.SILVER.getValue();
}
}
黄金会员
public class GoldStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("黄金会员8折");
return money*0.8;
}
@Override
public int getType() {
return VipEnum.GOLD.getValue();
}
}
白金会员
public class PlatinumStrategy implements VipStrategy {
@Override
public double getMoney(long money) {
System.out.println("白金会员7折");
return money*0.7;
}
@Override
public int getType() {
return VipEnum.PLATINUM.getValue();
}
}
- 初始化策略工厂
public class VipStrategyFactory {
private Map<Integer, VipStrategy> map;
public VipStrategyFactory() {
List<VipStrategy> strategies = new ArrayList<>();
strategies.add(new NormalStrategy());
strategies.add(new SilverStrategy());
strategies.add(new GoldStrategy());
strategies.add(new PlatinumStrategy());
map = strategies.stream().collect(Collectors.toMap(VipStrategy::getType, strategy -> strategy));
}
public static class Holder {
public static VipStrategyFactory instance = new VipStrategyFactory();
}
public static VipStrategyFactory getInstance() {
return Holder.instance;
}
public VipStrategy get(Integer type) {
return map.get(type);
}
}
- 根据type分别实例vipStrategy从而计算价格
public static double getMoney(long money, int type) {
VipStrategy strategy = VipStrategyFactory.getInstance().get(type);
if (strategy == null){
throw new IllegalArgumentException("对应vip策略不存在,[type={"+type+"}]");
}
return strategy.getMoney(money);
}