Эта статья будет о государственном дизайне шаблона . Это один из шаблонов дизайна поведения . Вам не нужно знать много теорий, чтобы понять основные понятия шаблона. Пост будет разбит на несколько частей, где я предоставлю информацию о ситуациях, когда необходимо применить шаблон, о минусах и плюсах, которые у него есть, и пример использования.
Иногда вам нужно изменить поведение объекта при изменении его внутреннего состояния. Государственный шаблон проектирования позволяет это сделать. Вы можете получить это путем создания отдельных классов, которые представляют различные состояния и функции. Конечно, эти классы должны наследоваться от одного абстрактного класса или реализовывать один интерфейс.
Шаблон проектирования 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. |