Приведи пример поведенческого паттерна
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Поведенческие паттерны проектирования
Поведенческие паттерны (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");
}
}
Ключевые преимущества
- Гибкость: легко менять поведение объектов
- Слабая связанность: объекты слабо зависят друг от друга
- Переиспользование кода: алгоритмы инкапсулированы
- Простота расширения: добавлять новые реализации просто
Поведенческие паттерны критически важны для построения масштабируемых и гибких приложений, особенно при работе с асинхронными операциями, обработкой событий и управлением состоянием.