美文网首页程序员
如何少用switch,多用strategy

如何少用switch,多用strategy

作者: 杭宇_8ba6 | 来源:发表于2020-07-15 17:57 被阅读0次

-第一步操作使用算法的角色,维护抽象策略类的引用:

/**
 * @Title :环境类【使用算法的角色,维护抽象策略类的引用】
 * @Author :hangyu
 * @Date :2020/7/15
 * @Version:1.0
 */
public interface OrderServiceProvider {

    OrderService getOrderService(Long orderType);
}

@Service
public class OrderServiceProviderImpl implements OrderServiceProvider {

    @Autowired
    private List<OrderService> orderServices;

    @Override
    public OrderService getOrderService(Long orderType) {
        for (OrderService orderService : orderServices){
            if (orderService.strategy(orderType)){
                return orderService;
            }
        }
        throw new IllegalArgumentException("strategy fail orderType is "+ orderType);
    }
}

-第二步操作声明抽象算法:

/**
 * @Title :抽象策略类【声明抽象算法,方便替换算法】
 * @Author :hangyu
 * @Date :2020/7/15
 * @Version:1.0
 */
public interface OrderService {

    /**
     * 匹配策略
     * @param orderType
     * @return
     */
    boolean strategy(Long orderType);

    /**
     * 创建订单
     * @param order
     */
    void createOrder(Order order);
}

public class Order implements Serializable {

    private static final long serialVersionUID = -1488118862353539472L;

    private Long orderType;

    private String orderDesc;


    public Long getOrderType() {
        return orderType;
    }

    public void setOrderType(Long orderType) {
        this.orderType = orderType;
    }

    public String getOrderDesc() {
        return orderDesc;
    }

    public void setOrderDesc(String orderDesc) {
        this.orderDesc = orderDesc;
    }
}

public enum OrderTypeEnum {

    GENERAL_ORDER(1L,"普通订单"),
    GROUP_ORDER(2L,"团购订单");

    private Long orderType;

    private String orderDesc;

    OrderTypeEnum(Long orderType, String orderDesc) {
        this.orderType = orderType;
        this.orderDesc = orderDesc;
    }

    public Long getOrderType() {
        return orderType;
    }

    public void setOrderType(Long orderType) {
        this.orderType = orderType;
    }

    public String getOrderDesc() {
        return orderDesc;
    }

    public void setOrderDesc(String orderDesc) {
        this.orderDesc = orderDesc;
    }
}

-第三步操作实现抽象策略类:

/**
 * @Title :具体策略类:[实现抽象策略类]
 * @Author :hangyu
 * @Date :2020/7/15
 * @Version:1.0
 */
public class GeneralOrderServiceImpl implements OrderService {

    @Override
    public boolean strategy(Long orderType) {
        return OrderTypeEnum.GENERAL_ORDER.getOrderType().equals(orderType);
    }

    @Override
    public void createOrder(Order order) {
        System.out.println(order.getOrderDesc() + "创建成功");
    }
}

/**
 * @Title :具体策略类:[实现抽象策略类]
 * @Author :hangyu
 * @Date :2020/7/15
 * @Version:1.0
 */
public class GroupOrderServiceImpl implements OrderService {

    @Override
    public boolean strategy(Long orderType) {
        return OrderTypeEnum.GROUP_ORDER.getOrderType().equals(orderType);
    }

    @Override
    public void createOrder(Order order) {
        System.out.println(order.getOrderDesc() + "创建成功");
    }
}

-第四步接口调用:

public class OrderCreateMain {

    @Autowired
    private OrderServiceProvider orderServiceProvider;

    public void createOrder(Long orderType,String orderDesc){
        OrderService orderService = orderServiceProvider.getOrderService(orderType);
        Order order = new Order();
        order.setOrderDesc(orderDesc);
        order.setOrderType(orderType);
        orderService.createOrder(order);
    }
}

原理是利用多态代替if else switch条件判断,如果方法有缓存用的时候需要注意。

相关文章

  • 如何少用switch,多用strategy

    -第一步操作使用算法的角色,维护抽象策略类的引用: -第二步操作声明抽象算法: -第三步操作实现抽象策略类: -第...

  • 2019-12-05

    多用事实,少用情绪;多用行动,少用说教;多用耐心,少用指责;多用接受,少用抗拒;多用拥抱,少用哭泣;多用爱,少用恨……

  • 多和少

    多用事实,少用情绪; 多用行动,少用说教; 多用耐心,少用指责; 多用接受,少用抗拒; 多用拥抱,少用哭泣; 多用...

  • 用心

    多用心,少用蛮力

  • Effective Objective-C 2.0阅读笔记与实践

    本文要点: 多用类型常量,少用#define预处理指令 用枚举表示状态、选项、状态码 多用类型常量,少用#defi...

  • 少用胳膊多用脑。

    当遇到麻烦事的时候,一定要沉住气,静下来,找一个安静的地方。找一张空白纸。拿出一支笔,想一想: 1.这件事到底有什...

  • 多用组合少用继承

    不推荐使用继承 继承表示is-a的关系,用于代码复用。但是继承会增加代码的耦合,复杂的继承关系(层次过深,过于复杂...

  • 多用“心”,少用“力”

    2021年10月6日 周三 天气:阴转多云 亲子日记第1374天 马驰翔马驰程妈妈 如果说每天都很忙让人感...

  • 少用权力,多用规则

    2022年11月7日星期一晴亲子日记莒县一中初中部2020级8班驰翔爸莒县第三实验小学2021.9驰程爸1766 ...

  • 少用权力 多用规则

    书名:《家庭教育指南》 进度:原则2/10 少用权力、多用规则 金句:家长最习惯使用的是权力工具,最容易失效的也是...

网友评论

    本文标题:如何少用switch,多用strategy

    本文链接:https://www.haomeiwen.com/subject/wwyjhktx.html