枚举类型使用策略模式。需要一个Java的简单示例。

3
我正在尝试理解Java中的策略模式和枚举。我已经在谷歌上搜索了一些相关文章,但其中大部分对我来说过于复杂。是否有人可以提供一个使用Java中的枚举以通俗易懂的方式演示策略模式的简单示例或另一个链接呢?
非常感谢您的帮助。

2
请求外部资源是不被允许的话题。为什么示例必须适用于枚举?策略模式与枚举完全独立。你理解这个模式本身吗?你了解枚举是什么吗? - Sotirios Delimanolis
我认为以下是一个很棒的例子,完美地实现了我所寻找的内容!谢谢。我想要一个枚举类型的例子,而不是一个过于冗长的类示例。 - Horse Voice
1个回答

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)来实现策略模式的维基百科文章的重新实现。

或者更详细地说,它是一个策略模式:

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;
}

1
注意:枚举常量应全部大写。 - Puce
2
@Puce - 我从不让教条主义妨碍可读性的实现。 :) - OldCurmudgeon
3
我的 IDE 把它识别为常量并用颜色提示我。我不需要篡改我的代码来支持一种古老和在我看来不好的命名惯例。聪明人明白教条和口号之间的区别。:) 我不会为了遵循编码标准而在我的代码中大声喊叫。 - OldCurmudgeon
不需要创建新的接口。您可以在枚举中创建一个抽象方法,如下所示:abstract int execute(int a, int b); - Wendel
1
@Wendel - 确实如此,但仅暴露interface将整体曝光降至最低,这通常是一个好主意。另一种选择是暴露整个Enum,这将允许用户采取自由,当然,他们会这样做。 - OldCurmudgeon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接