コンテンツにスキップ

Proxy

実オブジェクトの前に代理オブジェクトを置き、制御、遅延ロード、キャッシュを担当させるパターンです。

  • 重いリソースを遅延ロードしたいとき
  • リモート呼び出しの前段でキャッシュや権限確認を行いたいとき
  • Subject
  • Real Subject
  • Proxy

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using System.Collections.Generic;
public interface IRemoteInventoryService
{
IReadOnlyList<string> GetItemIds();
}
public sealed class CachingInventoryProxy : IRemoteInventoryService
{
private readonly IRemoteInventoryService remoteService;
private IReadOnlyList<string> cachedItemIds;
public CachingInventoryProxy(IRemoteInventoryService remoteService)
{
this.remoteService = remoteService;
}
public IReadOnlyList<string> GetItemIds()
{
cachedItemIds ??= remoteService.GetItemIds();
return cachedItemIds;
}
}
  • モジュール境界が明確になり、結合度を下げられます。
  • 既存コードを変更せずに機能拡張や統合がしやすくなります。
  • ラッパー層が深くなりすぎるとデバッグが難しくなります。
  • 責務境界が曖昧にならないよう、インターフェースは小さく保つべきです。

代理オブジェクトがアクセス制御、遅延ロード、キャッシュを担当する流れです。

Proxy の流れ