Sobes.tech
Назад к вопросам
Middle
169

Каковы отличия между шаблонами проектирования ООП 'Стратегия' и 'Состояние'?

Ответ от нейросети

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;
    }
}

Таким образом, стратегия фокусируется на выборе алгоритма, а состояние — на управлении поведением объекта в зависимости от его внутреннего состояния.