この記事は Google Cloud Translation APIを使用した自動翻訳です。
いくつかの文書は原文を読むのに良いかもしれません。
[リソース]セクションに元の文書へのリンクを追加します。
#074:Kotlinのプロキシパターン:他のオブジェクトにデリゲートまたはプレースホルダを与える
プロキシパターンは、サロゲートオブジェクトまたはプレースホルダオブジェクトを他のオブジェクトに提供するソフトウェアデザインパターンです。プロキシパターンでは、クラスは他のクラスの機能を表します。このタイプのデザインパターンは構造パターンに属します。
プロキシパターンには4種類あります。
この記事では、仮想プロキシパターンに焦点を当てます。
仮想プロキシは、他のオブジェクトを表すオブジェクトです。実際のオブジェクトは必要なときにのみ作成されます。たとえば、リモートサーバーからロードされているイメージです。画像はプロキシオブジェクトで表されます。プロキシオブジェクトはイメージに対する要求を処理します。イメージがロードされると、プロキシオブジェクトは実際のイメージオブジェクトに置き換えられます。
仮想プロキシを使用すると、次のことができます。
次の例を使用して、仮想プロキシパターンをデモンストレーションします。ユーザーを表す User クラスがあります。 User クラスには名前とアバターがあります。アバターはイメージです。仮想プロキシを使用してアバターイメージを表します。
class User(val name: String, val avatar: Image)
Image クラスはイメージを表します。 Image クラスには幅と高さがあります。
class Image(val width: Int, val height: Int)
ImageProxy クラスは Image クラスのプロキシです。 ImageProxy クラスには Image クラスへの参照があります。 ImageProxy クラスにはロードフラグもあります。ロードフラグは、Imageクラスがロード中かどうかを追跡するために使用されます。
class ImageProxy(val image: Image) {
val loading = false
}
loadImage() 関数は、Image クラスをロードするために使用されます。 loadImage() 関数はイメージ URL とコールバック関数を使用します。コールバック関数は、イメージがロードされると呼び出されます。
fun loadImage(imageUrl: String, callback: (Image) -> Unit) {
// TODO: load image from URL
}
main() 関数は ImageProxy オブジェクトで User オブジェクトを生成します。 ImageProxy オブジェクトはアバター画像を表します。 loadImage() 関数は、アバターイメージをロードするために使用されます。イメージがロードされると、ImageProxyオブジェクトはImageオブジェクトに置き換えられます。
fun main() {
val user = User("Alice", ImageProxy(null))
loadImage("avatar.jpg") { image ->
user.avatar = image
}
}
仮想プロキシパターンは、次の場合に使用する必要があります。
仮想プロキシパターンには次の利点があります。
仮想プロキシパターンには、次の欠点があります。
##リソース