Статьи

Поведенческие образцы дизайна: государство

Шаблон состояния имеет дело с изменением поведения объекта при изменении его состояния.

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

Мы создадим интерфейс с именем 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, являются их собственными.