Использование композиции и реализации в государственном шаблоне проектирования - PullRequest
0 голосов
/ 01 января 2019

Я прочитал эту ссылку введите описание ссылки здесь , чтобы узнать State Desing Patern.

класс интерфейса:

public interface State {
    void doAction();
}

onState класс:

public class TVStartState implements State {

    @Override
    public void doAction() {
        System.out.println("TV is turned ON");
    }
}

offState:

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

}

test 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 State и имеет Composition вместе?такое ошибка в ОО?потому что, например, Cat наследует от класса Animal и has_a animal вместе (в данном случае).

2-If Конечный программист в этом TestClass передает context в context.setState() вместо tvStartState или tvStopState , программа успешно компилируется, но ошибка в run_time.enter image description here

Для второго вопроса в State Design Pattern, вместо наследования можно использовать same name method.но int Шаблон оформления украшения нет.

1 Ответ

0 голосов
/ 01 января 2019
  1. Почему класс TVContext реализует State и имеет состав вместе?

Пример неверен, TVContext не должен реализовывать интерфейс State.Из диаграммы UML для шаблона проектирования состояний видно, что класс Context составляет только атрибут, реализующий интерфейс State.

UML diagram for State Design Pattern

Если последний программист в этом TestClass передает context в context.setState() вместо tvStartState или tvStopState , программа успешно компилируется, но с ошибками в run_time.

Причина, по которой он компилируется, заключается в том, что context реализует интерфейс State, но он не работает во время выполнения с java.lang.StackOverflowError, потому что функция context.setState() рекурсивно вызывает себя без выходасостояние.Удаление интерфейса State из класса TVContext устраняет эту проблему.

В Pattern Design Pattern цель состоит в том, чтобы добавить новое поведение в класс Component .Вот почему наследование используется для добавления новых методов в Component .

В State Design Pattern цель состоит в том, чтобы изменить поведение класса Context .Например, если мы реализуем его, используя наследование с абстрактным классом вместо интерфейса, операция над классами конкретного состояния должна переопределить операцию, определенную в абстрактном классе.Вот почему интерфейс имеет больше смысла в этом случае.

...