3

我阅读此链接在此处输入链接描述,以了解 State Desing 模式。

接口类:

public interface State {
    void doAction();
}

onState 类:

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");
    }

}

电视上下文类:

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();
    }

}

测试类:

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 implementsState 和有在一起Composition?是 OO 中的错误吗?因为例如 Cat 继承自 Animal 类和 has_a 动物一起(在这种情况下)。

2-如果此 TestClass 中的最终程序员将上下文传递给 context.setState()而不是tvStartStatetvStopState,则程序成功编译但在 run_time 中出错。 在此处输入图像描述

对于状态设计模式same name method中的第二个问题,可以使用 继承而不是继承。但 int装饰设计模式不是。

4

1 回答 1

8
  1. 为什么TVContext类实现State和组合在一起?

该示例不正确,TVContext不应实现 interface State。从状态设计模式的 UML 图中我们可以看到,该类Context仅构成一个实现接口的属性State

状态设计模式的 UML 图

  1. 如果此 TestClass 中的最终程序员将上下文传递给context.setState()tvStartState或tvStopState ,程序成功编译但在 run_time 中出错。

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

装饰器设计模式中,意图是向组件类添加新行为。这就是为什么使用继承向Component添加新方法的原因。

状态设计模式中,意图是改变Context类的行为。例如,如果我们使用抽象类而不是接口的继承来实现它,则对具体状态类的操作需要覆盖抽象类中定义的操作。这就是为什么在这种情况下接口更有意义的原因。

于 2019-01-01T11:27:37.013 回答