在状态设计模式中使用组合和实现

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() 而不是 tvStartStatetvStopState ,程序编译成功但在 run_time 中出错。

对于状态设计模式中的第二题,可以用same name method代替继承。但 int Decoration Design Pattern 不是。

  1. 为什么 TVContext class 实现 State 并且一起组合?

示例不正确,TVContext 不应实现接口 State。从状态设计模式的 UML 图我们可以看到 class Context 只有 组成一个实现接口 State.

的属性

  1. 如果此 TestClass 中的最终程序员将 context 传递给 context.setState() 而不是 tvStartStatetvStopState ,程序编译成功但在 run_time.
  2. 中出错

它编译的原因是因为 context 正在实现接口 State,但是它在 运行 时失败了 java.lang.WhosebugError 因为函数 context.setState() 在没有退出条件的情况下递归调用自身。从 TVContext class 中删除接口 State 可解决此问题。

装饰器设计模式 中,目的是向 Component class 添加新行为。这就是为什么使用继承来向 Component 添加新方法的原因。

State Design Pattern 中,目的是改变 Context class 的行为。例如,如果我们使用抽象 class 而不是接口的继承来实现它,那么对具体状态 class 的操作需要覆盖抽象 class 中定义的操作。这就是为什么接口在这种情况下更有意义。