Goで動的代理パターンを実装する方法
リフレクションを利用すれば、Go言語で動的代理パターンを実装できます。動的代理パターンでは、プロキシオブジェクトが代理対象オブジェクトのメソッド呼び出しを傍受して処理します。
以下は、リフレクションを用いてダイナミックプロキシパターンを実装する方法を示す、簡単なサンプルコードです。
package main
import (
"fmt"
"reflect"
)
// 定义被代理的接口
type Subject interface {
Do() string
}
// 被代理的对象
type RealSubject struct{}
func (r *RealSubject) Do() string {
return "RealSubject: handling request"
}
// 定义代理对象
type Proxy struct {
realSubject Subject
}
func (p *Proxy) Do() string {
// 在处理前的额外操作
fmt.Println("Proxy: before handling request")
// 使用反射调用被代理对象的方法
result := reflect.ValueOf(p.realSubject).MethodByName("Do").Call(nil)[0].String()
// 在处理后的额外操作
fmt.Println("Proxy: after handling request")
return result
}
func main() {
realSubject := &RealSubject{}
proxy := &Proxy{realSubject: realSubject}
result := proxy.Do()
fmt.Println(result)
}
上記コードでは、まずSubjectというインターフェースを定義しており、このインターフェースにはDoメソッドがあります。
次に、このインターフェースを実装するためにRealSubjectオブジェクトが作成され、Doメソッドが実装されています。
続いて、RealSubjectオブジェクトへの参照を含むProxyオブジェクトを作成しました。ProxyオブジェクトはSubjectインターフェースを実装しており、Doメソッドが呼び出されると、まず追加処理を実行し、次に反射を使用して代理オブジェクトのDoメソッドを呼び出して、最後に結果を返します。
Main関数は、RealSubjectオブジェクトとProxyオブジェクトを作成し、ProxyオブジェクトのDoメソッドを呼び出して、最終的な結果を出力しました。