我正在关注here
的策略模式示例教程中的所有内容都很清楚,但是:
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);
}
}
因此Context类在其构造函数中需要一个Strategy参数。
战略的定义是:
public interface Strategy {
public int doOperation(int num1, int num2);
}
上面是一个接口,Context Class需要一个Strategy类型的对象。在StrategyPatternDemo类中,我们执行:
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
我完全感到困惑,因为我们无法根据定义初始化接口:
界面在几个方面与类不同,包括:
您无法实例化界面。
此Context context = new Context(new OperationAdd());
如何作为参数发送到public Context(Strategy strategy){
this.strategy = strategy;
}
答案 0 :(得分:4)
类OperationAdd
,OperationSubstract
和OperationMultiply
都实现了接口Strategy
。因此,可以将这些类的实例传递给Context
的构造函数,该构造函数需要类型为Strategy
的对象。
当OperationAdd
,OperationSubstract
和OperationMultiply
实现接口Strategy
时,它们都属于该类型。
答案 1 :(得分:2)
您可能在示例的开头缺少这些行:
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
... // etc.
在这里你可以看到有一些"操作"实现Strategy接口的类。 实现接口的类基本上是一个"实际实例"那个界面。
如果您对此更清楚,您可以这样想:
答案 2 :(得分:2)
这是关于接口和类。
List
是一个接口,ArrayList
和LinkedList
是实现该接口的classe。
有理由:
List<String> books = new ArrayList<>();
void printList(List<String> list) { ... }
printList(books);
这允许通用,能够改变实现。