策略模式执行两个或更多算法

时间:2013-01-26 22:20:40

标签: java design-patterns strategy-pattern

任何人都可以让我举一个策略模式的例子,它不使用一个,而是使用两个或更多个算法吗?

也许我要在列表中插入这些算法,然后在此列表中使用for execute all算法?

此列表必须是上下文类的公共属性?

拜托,有人能让我成为伪代码示例吗?

3 个答案:

答案 0 :(得分:1)

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

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

如您所见,我们必须实施新的“复杂战略”。模式本身保持不变。

答案 1 :(得分:0)

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

虽然我无法想到这会有用的情况。

你想要做的事情并不清楚。

**基于您的评论**

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

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

<强> EDIT2

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

但这对我来说感觉各种各样的错误。

答案 2 :(得分:0)

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

如果你让每个人都对处理这个消息感到不满,你就有了责任链。