任何人都可以让我举一个策略模式的例子,它不使用一个,而是使用两个或更多个算法吗?
也许我要在列表中插入这些算法,然后在此列表中使用for execute all算法?
此列表必须是上下文类的公共属性?
拜托,有人能让我成为伪代码示例吗?
答案 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中,这是一个接口),然后您可以将它们保存在地图中,您可以根据类型的类型调度适当的一个。传入请求,或者您可以将它们保存在列表中并循环遍历它们并找到合适的请求。
如果你让每个人都对处理这个消息感到不满,你就有了责任链。