構造パターン
オブジェクトに動的に機能を追加する。継承よりも柔軟に振る舞いを拡張できる。
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;
}
}
// キャッシュ機能を追加
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"); // ログ→キャッシュヒット
以下のDecoratorパターンを作成してください。 【基本インターフェース】 HttpClient ・get(String url): Response ・post(String url, String body): Response 【追加したいDecorator】 1. RetryDecorator - 失敗時に最大3回リトライ 2. AuthDecorator - 認証ヘッダー自動付与 3. LoggingDecorator - リクエスト/レスポンスログ