振る舞いパターン
オブジェクトの状態変化を複数の依存オブジェクトに自動通知する。疎結合なイベント駆動設計を実現。
public interface StockObserver {
void onStockChange(String productId, int oldQuantity, int newQuantity);
}
public class StockManager {
private final Map<String, Integer> stock = new ConcurrentHashMap<>();
private final List<StockObserver> observers = new CopyOnWriteArrayList<>();
public void addObserver(StockObserver observer) {
observers.add(observer);
}
public void removeObserver(StockObserver observer) {
observers.remove(observer);
}
public void updateStock(String productId, int newQuantity) {
int oldQuantity = stock.getOrDefault(productId, 0);
stock.put(productId, newQuantity);
notifyObservers(productId, oldQuantity, newQuantity);
}
private void notifyObservers(String productId, int oldQty, int newQty) {
for (StockObserver observer : observers) {
observer.onStockChange(productId, oldQty, newQty);
}
}
}
public class LowStockAlertObserver implements StockObserver {
private final int threshold;
@Override
public void onStockChange(String productId, int oldQty, int newQty) {
if (newQty <= threshold && oldQty > threshold) {
System.out.println("在庫警告: " + productId);
}
}
}
public class StockLogObserver implements StockObserver {
@Override
public void onStockChange(String productId, int oldQty, int newQty) {
System.out.printf("[LOG] %s: %d → %d%n", productId, oldQty, newQty);
}
}
StockManager stockManager = new StockManager();
// Observerを登録
stockManager.addObserver(new StockLogObserver());
stockManager.addObserver(new LowStockAlertObserver(5));
// 在庫更新 → 全Observerに自動通知
stockManager.updateStock("PROD-A", 100);
stockManager.updateStock("PROD-A", 3); // アラート発生
以下のObserverパターンを作成してください。 【用途】 注文状態の変更通知 【イベント種類】 ・ORDER_CREATED - 注文作成 ・PAYMENT_COMPLETED - 決済完了 ・SHIPPED - 発送完了 【Observer】 1. EmailNotifier - 顧客へのメール通知 2. SlackNotifier - 社内Slack通知 3. AnalyticsLogger - 分析用ログ記録