在状态设计模式中使用组合和实现
Using Composition and Implementation in State Design Pattern
我读了这个 link enter link description here,
学习状态设计模式。
界面class:
public interface State {
void doAction();
}
onState class:
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
关闭状态:
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
TvContext Class:
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState=state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
测试Class:
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
现在我有两个问题:
1- 为什么 TVContext Class implements
状态和 Composition
在一起?
是 OO 中的错误吗?
因为例如 Cat 继承自 Animal class 和 has_a animal (在本例中)。
2-如果此测试中的最终程序员Class 将 context 传递给 context.setState()
而不是 tvStartState或 tvStopState ,程序编译成功但在 run_time 中出错。
对于状态设计模式中的第二题,可以用same name method
代替继承。但 int Decoration Design Pattern 不是。
- 为什么
TVContext
class 实现 State
并且一起组合?
示例不正确,TVContext
不应实现接口 State
。从状态设计模式的 UML 图我们可以看到 class Context
只有
组成一个实现接口 State
.
的属性
- 如果此 TestClass 中的最终程序员将 context 传递给
context.setState()
而不是 tvStartState 或 tvStopState ,程序编译成功但在 run_time. 中出错
它编译的原因是因为 context 正在实现接口 State
,但是它在 运行 时失败了 java.lang.WhosebugError
因为函数 context.setState()
在没有退出条件的情况下递归调用自身。从 TVContext
class 中删除接口 State
可解决此问题。
在 装饰器设计模式 中,目的是向 Component class 添加新行为。这就是为什么使用继承来向 Component 添加新方法的原因。
在 State Design Pattern 中,目的是改变 Context class 的行为。例如,如果我们使用抽象 class 而不是接口的继承来实现它,那么对具体状态 class 的操作需要覆盖抽象 class 中定义的操作。这就是为什么接口在这种情况下更有意义。
我读了这个 link enter link description here, 学习状态设计模式。
界面class:
public interface State {
void doAction();
}
onState class:
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
关闭状态:
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
TvContext Class:
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState=state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
测试Class:
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
现在我有两个问题:
1- 为什么 TVContext Class implements
状态和 Composition
在一起?
是 OO 中的错误吗?
因为例如 Cat 继承自 Animal class 和 has_a animal (在本例中)。
2-如果此测试中的最终程序员Class 将 context 传递给 context.setState()
而不是 tvStartState或 tvStopState ,程序编译成功但在 run_time 中出错。
对于状态设计模式中的第二题,可以用same name method
代替继承。但 int Decoration Design Pattern 不是。
- 为什么
TVContext
class 实现State
并且一起组合?
示例不正确,TVContext
不应实现接口 State
。从状态设计模式的 UML 图我们可以看到 class Context
只有
组成一个实现接口 State
.
- 如果此 TestClass 中的最终程序员将 context 传递给
context.setState()
而不是 tvStartState 或 tvStopState ,程序编译成功但在 run_time. 中出错
它编译的原因是因为 context 正在实现接口 State
,但是它在 运行 时失败了 java.lang.WhosebugError
因为函数 context.setState()
在没有退出条件的情况下递归调用自身。从 TVContext
class 中删除接口 State
可解决此问题。
在 装饰器设计模式 中,目的是向 Component class 添加新行为。这就是为什么使用继承来向 Component 添加新方法的原因。
在 State Design Pattern 中,目的是改变 Context class 的行为。例如,如果我们使用抽象 class 而不是接口的继承来实现它,那么对具体状态 class 的操作需要覆盖抽象 class 中定义的操作。这就是为什么接口在这种情况下更有意义。