【问题标题】:Using Composition and Implementation in State Design Pattern在状态设计模式中使用组合和实现
【发布时间】:2019-05-28 10:05:24
【问题描述】:

我读了这个链接enter link description here, 学习状态设计模式。

接口类:

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

}

TvContext 类:

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

2-如果这个TestClass中的最终程序员将context传递给context.setState()而不是tvStartStatetvStopState,程序编译成功但报错在运行时。

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

【问题讨论】:

  • 错误Program successfully compiles but error in run_time.是什么?可以发在这里吗?
  • 请不要包含文字的图片。如果您有错误堆栈跟踪,请使用{} 按钮将其复制并粘贴到您的问题和格式中。

标签: java oop design-patterns implements object-composition


【解决方案1】:
  1. 为什么TVContext 类实现State 并有组合?

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

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

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

Decorator Design Pattern 中,目的是为 Component 类添加新的行为。这就是为什么使用继承向组件添加新方法的原因。

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

【讨论】:

  • 好答案。 “在状态设计模式中,意图是改变 Context 类的行为”,如果它的内部状态发生了变化
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多