定義
このオブジェクトへのアクセスを制御するために、他のオブジェクトのプロキシを提供します
使用するシーン
オブジェクトに直接アクセスできない、またはアクセスしたくない場合、またはオブジェクトにアクセスするのが難しい場合は、プロキシオブジェクトを介して間接的にアクセスできます。クライアントの使用の透明性を確保するために、デリゲートオブジェクトとプロキシオブジェクトは同じインターフェースを実装する必要があります
UML 类图
- 件名:抽象サブジェクトクラス。実際のサブジェクトとエージェントの共通のインターフェースメソッドを宣言します。クラスは抽象クラスまたはインターフェースのいずれかです。
- RealSubject:実際のサブジェクトクラス/委任されたクラス/委任されたクラス。このクラスは、特定のビジネスロジックメソッドを実行するエージェントによって表される実オブジェクトを定義し、クライアントクラスは、エージェントクラスを介して実テーマクラスで定義されたメソッドを間接的に呼び出します。
- ProxySubject:プロキシクラス。このクラスは、実際のテーマクラスへの参照を保持し、実際のテーマクラスの対応するインターフェイスメソッドを呼び出して、実装するインターフェイスメソッドで実行することにより、プロキシとして機能します。
- クライアント:クライアントクラス。つまり、プロキシクラスのタイプを使用します
エージェントタイプ
プロキシモードは、静的プロキシと動的プロキシに分けられます。
- 静的プロキシ
プロキシクラスのコンパイル済みファイルは、コードが実行される前にすでに存在しており、プロキシクラスとデリゲートクラスの関係は実行前に決定されます。
- 動的プロキシ
エージェントのオブジェクトは、リフレクションメカニズムを通じて動的に生成されます。(誰がコードフェーズでプロキシする必要がないか、実行フェーズで誰をプロキシするかを決定します。Javaは動的プロキシインターフェイスInvocationHandlerを提供し、このインターフェイスの実装はその呼び出しメソッドを書き直す必要があります)
インスタンス
- 共有コード
interface ILawsuit {
fun submit() // 提交申请
fun burden()// 进行举证
fun defend()// 开始辩论
fun finish()// 诉讼完成
}
class Min : ILawsuit {
override fun submit() {
System.out.println("Min-------> 提交申请")
}
override fun burden() {
System.out.println("Min-------> 进行举证")
}
override fun defend() {
System.out.println("Min-------> 开始辩论")
}
override fun finish() {
System.out.println("Min-------> 诉讼完成")
}
}
- 静的プロキシ
class Lawyer(val mILawsuit: ILawsuit) : ILawsuit {
override fun burden() {
mILawsuit.burden()
}
override fun defend() {
mILawsuit.defend()
}
override fun finish() {
mILawsuit.finish()
}
override fun submit() {
mILawsuit.submit()
}
}
fun main(args: Array<String>) {
val min = Min()
// 静态代理
val lawyer = Lawyer(min)
lawyer.submit()
lawyer.burden()
lawyer.defend()
lawyer.finish()
}
- 動的プロキシ
class DynamicProxyLawyer(private val obj: Any) : InvocationHandler {
@Throws(Throwable::class)
override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
return method!!.invoke(obj, *(args ?: emptyArray()))
}
}
fun main(args: Array<String>) {
val min = Min()
// 动态代理
val proxy = DynamicProxyLawyer(min)
val lawyer = Proxy.newProxyInstance(min::class.java.classLoader, arrayOf(ILawsuit::class.java), proxy) as ILawsuit
lawyer.submit()
lawyer.burden()
lawyer.defend()
lawyer.finish()
}
補足:さまざまなタイプのエージェントをアプリケーションの範囲から区別する
- リモートエージェント
- 仮想エージェント
- 保護剤
- スマートエージェント
Androidソースコードでのプロキシモードの実装
ActivityManagerNativeとActivityManagerProxyはどちらもIActivityManagerを実装し、ActivityManagerProxyはプロキシ部分であり、ActivityManagerNativeは実数部分ですが、ActivityManagerNativeは抽象クラスであり、特定のロジック実装のほとんどはそのサブクラスActivityManagerServiceによって実行されます。