2

谁能给我举一个策略模式的例子,它不是按顺序使用一个,而是两个或多个算法?

也许我必须将这些算法插入列表中,然后使用 for 执行此列表中的所有算法?

这个列表必须是上下文类的公共属性吗?

请问,谁能给我一个伪代码示例?

4

3 回答 3

2

您可以实施一种策略,以特定顺序调用所有算法。我的示例与策略模式中描述的类相关联:

class MultiAlgorithm implements Strategy {

    private Strategy[] strategies;

    public MultiAlgorithm(Strategy... strategies) {
        if (strategies == null || strategies.length == 0) {
            throw new IllegalArgumentException(
                    "Algorithms collection cann't be null!");
        }
        this.strategies = strategies;
    }

    @Override
    public int execute(int a, int b) {
        System.out.println("Called MultiAlgorithm's execute()");
        int result = 0;
        for (Strategy strategy : strategies) {
            result += strategy.execute(a, b);
        }
        return result;
    }
}

使用示例

public static void main(String[] args) throws Exception {
    Context context = new Context(new MultiAlgorithm(new Add(),
            new Multiply(), new Subtract()));
    int result = context.executeStrategy(1, 2);
    System.out.println(result);
}

如你所见,我们只能实施新的“复杂策略”。模式自己保持不变。

于 2013-01-26T22:51:57.153 回答
0

你可以有一个你的策略的实现,它是你的策略的两个实例的组合,这些实例是按顺序执行的,不是吗?

虽然我想不出这会有用的情况。

您到底想做什么还不清楚。

** 基于您在下面的评论 **

我认为策略模式在这里不合适,因为您总是在做固定的事情,应用您拥有的所有噪声过滤器实现,并且策略模式用于在不同方法之间进行选择。您只有 1 种策略!

我会将其实现为处理管道。使用您一开始就知道的所有算法按照您想要应用它们的顺序创建管道。在 run 方法中调用管道,该管道依次调用每个算法。当系统引发新事件以表示新处理器可用时,将其添加到管道中。

编辑2

如果具有 run 方法的对象是模式中的主题,并且当添加新处理器时,调用 addsubscriber 方法将处理器添加到列表中,您可能可以使用观察者模式(尽管不太适合恕我直言)来实现它。然后,当调用 run 时,您迭代订阅者列表并将声音传递给他们以进行修改。

但这对我来说感觉很不对劲。

于 2013-01-26T22:27:27.897 回答
0

听起来你的任务试图得到的是你有一些外部代码(可能是一个控制器),它必须在运行时决定使用哪种方法来处理某些事情。这通常是通过 Strategy 完成的:处理程序都是 Strategy 的实现(在 Java 中,这是一个接口),然后您可以将它们保存在一个映射中,在该映射中您可以根据诸如传入的请求,或者您可以将它们保存在一个列表中并遍历它们并找到合适的请求。

如果您让每个人都在处理消息方面有所了解,那么您就有了责任链。

于 2013-01-26T22:28:32.120 回答