Статьи

Шаблоны проектирования: состояние

Эта статья будет о государственном дизайне шаблона . Это один из шаблонов дизайна поведения . Вам не нужно знать много теорий, чтобы понять основные понятия шаблона. Пост будет разбит на несколько частей, где я предоставлю информацию о ситуациях, когда необходимо применить шаблон, о минусах и плюсах, которые у него есть, и пример использования. Java-дизайн-шаблоны

Иногда вам нужно изменить поведение объекта при изменении его внутреннего состояния. Государственный шаблон проектирования позволяет это сделать. Вы можете получить это путем создания отдельных классов, которые представляют различные состояния и функции. Конечно, эти классы должны наследоваться от одного абстрактного класса или реализовывать один интерфейс.

Шаблон проектирования State можно использовать, когда нам нужно изменить состояние объекта во время выполнения, введя в него различные подклассы некоторого базового класса State. Это обстоятельство является преимуществом и недостатком в то же время, потому что у нас есть четкие отдельные классы состояний с некоторой логикой, а с другой стороны, число классов растет.

Давайте рассмотрим пример. Каждый год имеет 4 сезона: зима, весна, лето и осень. Каждый сезон имеет свой порядок, например, весна наступает после зимы, лето наступает после весны и так далее.

Базовый интерфейс состояния для сезонов:

1
2
3
public interface Season {
    public void theSeason(SeasonContext context);
}

Стратегия-Дизайн-шаблон

Классы состояний, которые реализуют интерфейс Season:

1
2
3
4
5
6
7
8
9
public class Winter implements Season {
 
    @Override
    public void theSeason(SeasonContext context) {
        System.out.println("Winter is now.");
        context.setSeason(new Spring());
    }
 
}

Весенний класс:

1
2
3
4
5
6
7
8
9
public class Spring implements Season {
 
    @Override
    public void theSeason(SeasonContext context) {
        System.out.println("Spring is now");
        context.setSeason(new Summer());
    }
 
}

Я опущу уроки на лето и осень, потому что они такие же, как на предыдущих уроках.

Класс SeasonContext:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class SeasonContext {
    private Season season;
 
    public SeasonContext() {
        this.season = new Winter();
    }
 
    public void setSeason(Season season) {
        this.season = season;
    }
 
    public void whatTheSaeson() {
        season.theSeason(this);
    }
}

Все это демонстрирует архитектуру шаблона State: базовый интерфейс состояния, классы, которые реализуют интерфейс состояния и контекст состояния. Теперь посмотрим, как это работает:

1
2
3
4
5
6
7
8
9
...
    public static void main(String[] args) {
        SeasonContext sc = new SeasonContext();
        sc.whatTheSaeson();
        sc.whatTheSaeson();
        sc.whatTheSaeson();
        sc.whatTheSaeson();
    }
...

Результат будет:

1
2
3
4
Winter is now.
Spting is now
Summer is now.
Autumn is now.