Decorator
構造パターン
オブジェクトに動的に機能を追加する。継承よりも柔軟に振る舞いを拡張できる。
クラス図
シーケンス図
使いどころ
- ログ出力の追加(メソッド実行前後)
- キャッシュ機能の付与
- 認証・認可チェックの追加
- 入出力ストリームの加工(圧縮、暗号化)
- トランザクション管理
コード例
基本インターフェース
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 - リクエスト/レスポンスログ