Шаблон состояния имеет дело с изменением поведения объекта при изменении его состояния.
Представьте себе случай класса, отвечающего за создание пользовательского интерфейса на основе состояния. Вы получили анонимных, авторизованных и администраторских пользователей.
Мы создадим интерфейс с именем GreetingState, который определяет действие рисования HTML-текста с приветственным сообщением для пользователя. Там будет другая реализация в зависимости от наших состояний.
|
1
2
3
4
5
6
7
|
package com.gkatzioura.design.behavioural.state;public interface GreetingState { String create();} |
Мы реализуем GreetingState для анонимного пользователя.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
package com.gkatzioura.design.behavioural.state;public class AnonymousGreetingState implements GreetingState { private static final String FOOTER_MESSAGE = "<p><Hello anonymous user!</p>"; @Override public String create() { return FOOTER_MESSAGE; }} |
Затем мы реализуем GreetingState для вошедшего в систему пользователя. Это создаст персонализированное сообщение.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.gkatzioura.design.behavioural.state;public class LoggedInGreetingState implements GreetingState { private static final String FOOTER_MESSAGE = "<p><Hello %s!</p>"; private final String username; public LoggedInGreetingState(final String username) { this.username = username; } @Override public String create() { return String.format(FOOTER_MESSAGE,username); }} |
И наконец, админ Футер.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.gkatzioura.design.behavioural.state;import java.util.Date;public class AdminGreetingState implements GreetingState { private static final String FOOTER_MESSAGE = "<p><Hello %s, last login was at %s</p>"; private final String username; private final Date lastLogin; public AdminGreetingState(final String username, Date lastLogin) { this.username = username; this.lastLogin = lastLogin; } @Override public String create() { return String.format(FOOTER_MESSAGE,username,lastLogin); }} |
Мы создадим контекст состояния.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
package com.gkatzioura.design.behavioural.state;import java.io.PrintWriter;public class StateUIContext { private GreetingState greetingState; public void setGreetingState(GreetingState greetingState) { this.greetingState = greetingState; } public void create(PrintWriter printWriter) { printWriter.write(greetingState.create()); }} |
Давайте сложим их все вместе.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.gkatzioura.design.behavioural.state;import java.io.PrintWriter;import java.util.Date;public class StateMain { public static void main(String[] args) { StateUIContext stateUIContext = new StateUIContext(); try(PrintWriter printWriter = new PrintWriter(System.out)) { stateUIContext.setGreetingState(new AnonymousGreetingState()); stateUIContext.create(printWriter); printWriter.write("\n"); stateUIContext.setGreetingState(new LoggedInGreetingState("someone")); stateUIContext.create(printWriter); printWriter.write("\n"); stateUIContext.setGreetingState(new AdminGreetingState("admin",new Date())); stateUIContext.create(printWriter); printWriter.write("\n"); } }} |
Вы можете найти исходный код на github .
| Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Поведенческие модели дизайна: состояние
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |