使用枚举的策略模式。在Java中需要一个简单的例子

时间:2014-06-26 15:55:23

标签: java java-ee design-patterns enums strategy-pattern

我试图理解java中的策略模式和枚举。我已经搜索了这篇文章,并且已经找到了一些关于这个主题的文章,但是大多数文章对我的理解来说似乎太复杂了。任何人都可以使用java提供一个简单的示例或其他链接来演示使用枚举术语中的枚举的策略模式吗?

提前谢谢你。

1 个答案:

答案 0 :(得分:15)

这应该做:

interface Strategy {

    int execute(int a, int b);
}

enum Math implements Strategy {

    Add {

                @Override
                public int execute(int a, int b) {
                    return a + b;
                }
            },
    Subtract {

                @Override
                public int execute(int a, int b) {
                    return a - b;
                }
            },
    Multiply {

                @Override
                public int execute(int a, int b) {
                    return a * b;
                }
            };
}

这是使用enum为策略重新实施Wikipedia article

或者更长一点但更明确的策略模式:

public interface FailureStrategy {
    void fail (String message);
}

enum Failure implements FailureStrategy {
    Ignore {

        @Override
        public void fail(String message) {
            // Do nothing on success.
        }

    },
    LogToConsole {

        @Override
        public void fail(String message) {
            System.out.println(message);
        }

    },
    ErrToConsole {

        @Override
        public void fail(String message) {
            System.err.println(message);
        }

    },
    RingAlarmBells {

        @Override
        public void fail(String message) {
            // Left to the student.
        }

    },
    SoundTheKlaxon {

        @Override
        public void fail(String message) {
            // Left to the student.
        }

    },
    EndTheWorld {

        @Override
        public void fail(String message) {
            // Left to the student.
        }

    };
}

public class SomethingLethal {
    public FailureStrategy onFail = Failure.EndTheWorld;
}

public class SomethingDangerous {
    public FailureStrategy onFail = Failure.RingAlarmBells;
}

public class SomethingBenign {
    public FailureStrategy onFail = Failure.Ignore;
}