Каковы отличия между шаблонами проектирования ООП 'Стратегия' и 'Состояние'?
Ответ от нейросети
sobes.tech AI
Паттерны "Стратегия" и "Состояние" оба используют полиморфизм для изменения поведения объекта, но применяются в разных контекстах и решают разные задачи.
-
Стратегия (Strategy) — позволяет выбирать алгоритм или поведение объекта во время выполнения. Основная идея — инкапсулировать различные алгоритмы в отдельные классы и менять их динамически.
Пример: сортировка списка с разными алгоритмами (быстрая, пузырьковая и т.д.).
-
Состояние (State) — позволяет объекту менять свое поведение в зависимости от внутреннего состояния, при этом объект выглядит так, как будто изменил свой класс.
Пример: объект, который ведет себя по-разному в состоянии "Включен" и "Выключен".
Ключевые отличия:
| Аспект | Стратегия | Состояние |
|---|---|---|
| Цель | Выбор алгоритма/поведения | Изменение поведения в зависимости от состояния |
| Контекст | Внешний выбор стратегии | Внутреннее состояние объекта |
| Изменение поведения | Внешнее переключение | Автоматическое переключение состояний |
Пример на Java:
// Стратегия
interface PaymentStrategy {
void pay(int amount);
}
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Оплата кредитной картой: " + amount);
}
}
class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Оплата через PayPal: " + amount);
}
}
class ShoppingCart {
private PaymentStrategy strategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void checkout(int amount) {
strategy.pay(amount);
}
}
// Состояние
interface State {
void doAction(Context context);
}
class StartState implements State {
public void doAction(Context context) {
System.out.println("Состояние: старт");
context.setState(this);
}
}
class StopState implements State {
public void doAction(Context context) {
System.out.println("Состояние: стоп");
context.setState(this);
}
}
class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
Таким образом, стратегия фокусируется на выборе алгоритма, а состояние — на управлении поведением объекта в зависимости от его внутреннего состояния.