Iva*_*van 5 java design-patterns strategy-pattern
我无法理解为什么在策略设计模式中使用Context模块(我们将在下面的代码中看到),它的功能是什么?让我们看一下战略设计模式的一部分.
public interface Strategy {
public int doOperation(int num1, int num2);
}
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubstract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,我们可以通过这种方式调用不同的算法:
Context context = new Context(new OperationAdd());
context.executeStrategy(10,5);
Run Code Online (Sandbox Code Playgroud)
我无法完全理解,为什么不能直接调用子类,而是使用Context层.在我看来,就像这样:
Strategy addStrategy = new OperationAdd();
addStrategy.doOperation(10, 5);
Run Code Online (Sandbox Code Playgroud)
尽管我不喜欢这个例子,我还是会解释拥有 Context 的优点。
这里Context已用于包装所有策略。如果使用得当,它可以充当迷你立面或工厂。
如果我必须实现Context,我将在构造过程中创建一次所有策略,并实现一个Factory_Method以Strategy根据输入参数返回要使用的策略。即使我们可以用这种方法if else来避免这种情况。
一旦我得到了策略,我将简单地调用executeStrategy它隐藏我的策略的内部结构。
如果没有Context,调用者必须在执行策略之前获取具体策略。如果您在应用程序中调用Add或Subtract策略 100 次,则必须公开特定的具体策略。
如果我有Context,它将通过隐藏我的策略来提供正确的策略,并且可以在运行时切换策略。
另一方面:维基百科的Strategy_Pattern提供了很好的例子。这个例子可能与问题无关,但它将提供很好的见解来理解策略模式的有效性(特别是“策略和开放/封闭原则”部分)
为了更好地理解Strategy模式,请查看这篇文章:
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |