使用策略枚举来代替策略模式

策略模式

策略模式实践

举例用策略模式实现加减运算,首先定义抽象策略角色(Strategy接口)

public interface IStrategy {
    int exec(int a, int b);
}

然后定义加减法具体策略角色(ConcreteStrategyA,ConcreteStrategyB)

public class StrategyADD implements IStrategy {
    @Override
    public int exec(int a, int b) {
        return a + b;
    }
}
public class StrategySub implements IStrategy {
    @Override
    public int exec(int a, int b) {
        return a - b;
    }
}

定义封装角色(Context)

public class Calculator {

    private IStrategy strategy;

    public Calculator(IStrategy strategy) {
        this.strategy = strategy;
    }

    public int exec(int a, int b) {
        return strategy.exec(a, b);
    }
}

测试

@Test
    public void testStrate() {
        IStrategy strategy = new StrategyADD();
        int result = new Calculator(strategy).exec(1, 3);
        IStrategy strategy2 = new StrategySub();
        int result2 = new Calculator(strategy2).exec(2, 1);
        assertEquals(4, result);
        assertEquals(1, result2);
    }

策略枚举

Effective Java 第二版的第30条就给出来策略枚举模式,运用策略枚举来实现上面的策略模式

public enum CalculatorEnum {

    ADD("+") {
        @Override
        public int exec(int a, int b) {
            return a + b;
        }
    },
    SUB("-") {
        @Override
        public int exec(int a, int b) {
            return a - b;
        }
    };

    CalculatorEnum(String s) {
        this.value = s;
    }

    private final String value;

    public abstract int exec(int a, int b);
}

测试

@Test
    public void testCalculatorEnum() {
        int addResult = CalculatorEnum.ADD.exec(1, 3);
        int subResult = CalculatorEnum.SUB.exec(2, 1);
        assertEquals(4, addResult);
        assertEquals(1, subResult);
    }

总之,每当需要一组固定常量的时候,就应该使用枚举。多个枚举常量同时共享相同的行为用策略枚举。

参考文章
策略模式(政策模式) 策略枚举
优雅编程之这样使用枚举和注解,你就“正常”了(二十九)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 枚举类型是指由一组固定的常量组成合法值的类型,例如一年中的季节,太阳系中的行星或者一副牌中的花色。在编程语言...
    小小辉_710a阅读 1,465评论 0 0
  • 年终了,惯例要写个年终总结,小果也来凑热闹,写个年终的总结向,翻翻从14年7月创办至今到现在的照片,真是激动的老泪...
    悠果教育YouGo阅读 633评论 0 0
  • 那个笑起来眼睛弯弯成月牙,灿若星光,梨涡勾起俏皮弧度,耀如暖阳的姑娘,她恋爱了。 那个在你耳边喋喋不休谈起心爱的明...
    Trapheart阅读 31,029评论 360 855