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