← 一覧に戻る

Decorator

構造パターン

オブジェクトに動的に機能を追加する。継承よりも柔軟に振る舞いを拡張できる。

目次
  1. クラス図
  2. シーケンス図
  3. 使いどころ
  4. コード例
  5. AIプロンプト例
  6. 関連パターン

クラス図

シーケンス図

使いどころ

コード例

基本インターフェース

public interface DataService {
    String getData(String key);
    void saveData(String key, String value);
}

基本実装

public class DatabaseService implements DataService {
    @Override
    public String getData(String key) {
        System.out.println("DBからデータ取得: " + key);
        return "data_" + key;
    }
}

Decorator

// キャッシュ機能を追加
public class CachingDecorator implements DataService {
    private final DataService wrapped;
    private final Map<String, String> cache = new ConcurrentHashMap<>();

    public CachingDecorator(DataService wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public String getData(String key) {
        if (cache.containsKey(key)) {
            System.out.println("キャッシュヒット: " + key);
            return cache.get(key);
        }
        String value = wrapped.getData(key);
        cache.put(key, value);
        return value;
    }
}

// ログ機能を追加
public class LoggingDecorator implements DataService {
    private final DataService wrapped;

    @Override
    public String getData(String key) {
        System.out.println("[LOG] getData開始: " + key);
        String result = wrapped.getData(key);
        System.out.println("[LOG] getData完了");
        return result;
    }
}

使用例

// Decoratorを重ねて機能追加
DataService service = new LoggingDecorator(
    new CachingDecorator(
        new DatabaseService()
    )
);

service.getData("user:123"); // ログ→キャッシュ→DB
service.getData("user:123"); // ログ→キャッシュヒット

AIプロンプト例

カスタマイズ用プロンプト

以下のDecoratorパターンを作成してください。

【基本インターフェース】
HttpClient
・get(String url): Response
・post(String url, String body): Response

【追加したいDecorator】
1. RetryDecorator - 失敗時に最大3回リトライ
2. AuthDecorator - 認証ヘッダー自動付与
3. LoggingDecorator - リクエスト/レスポンスログ
← 一覧に戻る