策略模式代替臃肿if/else

一、 什么是策略模式

它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口 对所有的算法加以封装和实现,具体的算法选择 交由客户端决定(策略)。

策略模式代替臃肿if/else

二、 策略模式的角色

1、环境(Context)角色: 持有一个Strategy的引用。

2、抽象策略(Strategy)角色: 这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

3、具体策略(ConcreteStrategy)角色: 包装了相关的算法或行为。

三、策略模式的优缺点

优点:

1、代码中的if、switch判断逻辑可以去掉;

2、代码优雅、可复用、可读性好、便于维护;

3、策略模式遵循开闭原则,实现代码的解耦合;

缺点:

1、 策略如果很多的话就会出现很多策略类,会造成策略类膨胀;

2、 使用者必须清楚所有的策略类及其用途;

四、策略模式的实现

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。

环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。

五、策略模式的编写步骤

1.对策略对象定义一个公共接口。

2.编写策略类,该类实现了上面的公共接口。

3.在使用策略对象的类中保存一个对策略对象的引用。

4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。

六、实列

抽象折扣类

public interface MemberStrategy {

    /**
     * 计算原油的价格
     * @param crudeOilPrice    原油的原价
     * @return    计算出打折后的价格
     */
    double calcPrice(double crudeOilPrice);
}

初级会员折扣类

public class PrimaryMemberStrategyImpl implements MemberStrategy {
    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("对于初级会员的没有折扣");
        return crudeOilPrice;
    }
}

中级会员折扣类

public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("对于中级会员的折扣为10%");
        return crudeOilPrice * 0.9;
    }
}

高级会员折扣类

public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("对于高级会员的折扣为20%");
        return crudeOilPrice * 0.8;
    }
}

贵宾会员折扣类

public class VisitantMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("对于贵宾会员的折扣为25%");
        return crudeOilPrice * 0.75;
    }
}

价格类

public class Price {

    //持有一个具体的策略对象
    private MemberStrategy strategy;
    /**
     * 构造函数,传入一个具体的策略对象
     * @param strategy    具体的策略对象
     */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }

    /**
     * 计算原油的价格
     * @param crudeOilPrice    原油的原价
     * @return    计算出打折后的价格
     */
    public double quote(double crudeOilPrice){
        return this.strategy.calcPrice(crudeOilPrice);
    }
}

总结:if else作为每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高,可以利用策略模式来替代if/else。

上一篇:Hyperledger Fabric Capabilities——超级账本功能汇总


下一篇:Linux运维工程师:30道面试题整理