← Назад к вопросам

Приведи пример поведенческого паттерна

2.2 Middle🔥 111 комментариев
#SOLID и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поведенческие паттерны проектирования

Поведенческие паттерны (Behavioral Patterns) отвечают за распределение ответственности между объектами и определение их взаимодействия. Вот несколько ярких примеров:

1. Паттерн Observer (Наблюдатель)

Observer создаёт механизм подписки для уведомления множества объектов об изменениях состояния. Это один из самых используемых паттернов в Java, особенно в UI-фреймворках.

interface Observer {
    void update(String message);
}

class Publisher {
    private List<Observer> observers = new ArrayList<>();
    private String state;
    
    public void attach(Observer observer) {
        observers.add(observer);
    }
    
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    
    public void setState(String newState) {
        this.state = newState;
        notifyObservers();
    }
    
    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

class Subscriber implements Observer {
    private String name;
    
    public Subscriber(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        System.out.println(name + " получил уведомление: " + message);
    }
}

// Использование
Publisher publisher = new Publisher();
publisher.attach(new Subscriber("Иван"));
publisher.attach(new Subscriber("Мария"));
publisher.setState("Новое событие");

2. Паттерн Strategy (Стратегия)

Strategy инкапсулирует семейство алгоритмов в отдельные классы и делает их взаимозаменяемыми. Это позволяет выбирать алгоритм во время выполнения.

interface PaymentStrategy {
    void pay(double amount);
}

class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Оплата кредитной картой: " + amount);
    }
}

class PayPalPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Оплата через PayPal: " + amount);
    }
}

class ShoppingCart {
    private PaymentStrategy strategy;
    
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void checkout(double total) {
        strategy.pay(total);
    }
}

// Использование
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100.0);

cart.setPaymentStrategy(new PayPalPayment());
cart.checkout(50.0);

3. Паттерн State (Состояние)

State позволяет объекту изменять своё поведение в зависимости от своего состояния. При этом кажется, что изменился класс объекта.

interface OrderState {
    void process(Order order);
}

class NewOrderState implements OrderState {
    @Override
    public void process(Order order) {
        System.out.println("Заказ создан");
        order.setState(new ProcessingOrderState());
    }
}

class ProcessingOrderState implements OrderState {
    @Override
    public void process(Order order) {
        System.out.println("Заказ обрабатывается");
        order.setState(new ShippedOrderState());
    }
}

class ShippedOrderState implements OrderState {
    @Override
    public void process(Order order) {
        System.out.println("Заказ отправлен");
        order.setState(new DeliveredOrderState());
    }
}

class Order {
    private OrderState state;
    
    public Order() {
        this.state = new NewOrderState();
    }
    
    public void setState(OrderState state) {
        this.state = state;
    }
    
    public void process() {
        state.process(this);
    }
}

// Использование
Order order = new Order();
order.process(); // Заказ создан
order.process(); // Заказ обрабатывается
order.process(); // Заказ отправлен

4. Паттерн Template Method (Шаблонный метод)

Template Method определяет скелет алгоритма в базовом классе, оставляя подробности для реализации подклассами.

abstract class DataProcessor {
    public final void process(String data) {
        validate(data);
        transform(data);
        save(data);
    }
    
    protected abstract void validate(String data);
    protected abstract void transform(String data);
    protected abstract void save(String data);
}

class XMLProcessor extends DataProcessor {
    @Override
    protected void validate(String data) {
        System.out.println("Валидация XML");
    }
    
    @Override
    protected void transform(String data) {
        System.out.println("Трансформация XML");
    }
    
    @Override
    protected void save(String data) {
        System.out.println("Сохранение XML");
    }
}

Ключевые преимущества

  • Гибкость: легко менять поведение объектов
  • Слабая связанность: объекты слабо зависят друг от друга
  • Переиспользование кода: алгоритмы инкапсулированы
  • Простота расширения: добавлять новые реализации просто

Поведенческие паттерны критически важны для построения масштабируемых и гибких приложений, особенно при работе с асинхронными операциями, обработкой событий и управлением состоянием.

Приведи пример поведенческого паттерна | PrepBro