《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse
我是肥哥,一名不专业的面试官!
我是囧囧,一名积极找工作的小菜鸟!
囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!!
本期主要面试考点
面试官考点之如何用设计模式替换业务场景中复杂的ifelse?
VIP类型
import java.util.Objects;
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 会员类型
*/
public enum VIPEnums {
GOLD(1, "黄金会员"),
STAR(2, "星钻会员"),
SPORTS(3, "体育会员"),
FUN_VIP(4, "FUN会员");
private final int code;
private final String desc;
VIPEnums(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static VIPEnums getByCode(Integer code) {
for (VIPEnums s : VIPEnums.values()) {
if (Objects.equals(s.getCode(), code)) {
return s;
}
}
return null;
}
}
VIP实体
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmeifeishi@163.com
*
* vip
*/
public class VIP {
private VIPEnums vipType;
// TODO VIP 其他属性 id, name ...
public VIP() {
}
public VIP(VIPEnums vipType) {
this.vipType = vipType;
}
public VIPEnums getVipType() {
return vipType;
}
public void setVipType(VIPEnums vipType) {
this.vipType = vipType;
}
}
if-else 模式
// if-else 模式
public class App {
public static void main( String[] args ) {
// 黄金会员
VIP vip = new VIP(VIPEnums.GOLD);
if (vip.getVipType().getCode() == VIPEnums.GOLD.getCode()) {
// TODO 黄金会员权益
} else if (vip.getVipType().getCode() == VIPEnums.STAR.getCode()) {
// TODO 星钻会员权益
} else if (vip.getVipType().getCode() == VIPEnums.SPORTS.getCode()) {
// TODO 体育会员权益
} else if (vip.getVipType().getCode() == VIPEnums.FUN_VIP.getCode()) {
// TODO FUN会员权益
} else {
// TODO 其他会员...
}
}
}
策略模式
VIP策略接口
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
* VIP 策略接口
*/
public interface VIPStrategy {
// VIP 具备的权益
void equity();
}
策略接口具体实现类-黄金会员
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 策略接口具体实现类-黄金会员
*/
public class GoldVIPStrategyImpl implements VIPStrategy {
@Override
public void equity() {
// TODO 黄金会员具备的具体权益
}
}
策略接口具体实现类-星钻会员
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 策略接口具体实现类-星钻会员
*/
public class StarVIPStrategyImpl implements VIPStrategy {
@Override
public void equity() {
// TODO 星钻会员具备的具体权益
}
}
策略接口具体实现类-体育会员
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 策略接口具体实现类-体育会员
*/
public class SportsVIPStrategyImpl implements VIPStrategy {
@Override
public void equity() {
// TODO 体育会员具备的具体权益
}
}
策略接口具体实现类-FUN会员
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 策略接口具体实现类-FUN会员
*/
public class FunVIPStrategyImpl implements VIPStrategy {
@Override
public void equity() {
// TODO FUN会员具备的具体权益
}
}
策略上下文类
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 策略上下文类( vip 策略接口的持有者)
*/
public class VIPStrategyContext {
private VIPStrategy vipStrategy;
// 设置VIP策略
public void setVipStrategy(VIPStrategy vipStrategy) {
this.vipStrategy = vipStrategy;
}
// 执行 VIP 权益
public void handle() {
if (vipStrategy != null) {
vipStrategy.equity();
}
}
}
策略工厂
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* VIP策略工厂
*/
public class VIPStrategyFactory {
private VIPStrategyFactory() {
}
public static VIPStrategy getVipStrategy(VIP vip) {
VIPStrategy vipStrategy = null;
if (vip.getVipType().getCode() == VIPEnums.GOLD.getCode()) {
// 黄金会员策略实现类
vipStrategy = new GoldVIPStrategyImpl();
} else if (vip.getVipType().getCode() == VIPEnums.STAR.getCode()) {
// 星钻会员策略实现类
vipStrategy = new StarVIPStrategyImpl();
} else if (vip.getVipType().getCode() == VIPEnums.SPORTS.getCode()) {
// 体育会员策略实现类
vipStrategy = new SportsVIPStrategyImpl();
} else if (vip.getVipType().getCode() == VIPEnums.FUN_VIP.getCode()) {
// FUN会员策略实现类
vipStrategy = new FunVIPStrategyImpl();
} else {
// 其他会员...
}
return vipStrategy;
}
}
模拟会员登录获取权益
/**
* @author: 欢迎关注喂信公猪号:囧么肥事
* @date: 2021/12/16
* @email: jiongmefeishi@163.com
*
* 模拟会员登录获取权益
*/
public class TestStrategy {
public static void main(String[] args) {
// 黄金会员
VIP vip = new VIP(VIPEnums.GOLD);
// 策略上下文,执行者
VIPStrategyContext context = new VIPStrategyContext();
// 根据会员类型,获取会员具体策略,获取黄金会员策略
VIPStrategy strategy = VIPStrategyFactory.getVipStrategy(vip);
// 绑定给执行者
context.setVipStrategy(strategy);
// 执行黄金会员的策略,黄金权益
context.handle();
}
}
我们知道, 策略模式的本身设计出来的目的是封装一系列的算法,这些算法都具有共性,可以相互替换,算法独立于使用它的客户端独立变化,客户端不需要了解关注算法的具体实现,客户端仅仅依赖于策略接口 。
通过使用策略模式和工厂模式结合,是不是感觉变得高大上起来了呢?