Golang鍔ㄦ€佷唬鐞嗘ā寮忔€庝箞瀹炵幇
鍦℅olang涓疄鐜板姩鎬佷唬鐞嗘ā寮忓彲浠ヤ娇鐢ㄥ弽灏勬潵瀹炵幇銆傚湪鍔ㄦ€佷唬鐞嗘ā寮忎腑锛屼唬鐞嗗璞℃嫤鎴苟澶勭悊琚唬鐞嗗璞$殑鏂规硶璋冪敤銆?/p>
涓嬮潰鏄竴涓畝鍗曠殑绀轰緥浠g爜锛屾紨绀轰簡濡備綍浣跨敤鍙嶅皠瀹炵幇鍔ㄦ€佷唬鐞嗘ā寮忥細
package main
import (
"fmt"
"reflect"
)
// 瀹氫箟琚唬鐞嗙殑鎺ュ彛
type Subject interface {
Do() string
}
// 琚唬鐞嗙殑瀵硅薄
type RealSubject struct{}
func (r *RealSubject) Do() string {
return "RealSubject: handling request"
}
// 瀹氫箟浠g悊瀵硅薄
type Proxy struct {
realSubject Subject
}
func (p *Proxy) Do() string {
// 鍦ㄥ鐞嗗墠鐨勯澶栨搷浣?/span>
fmt.Println("Proxy: before handling request")
// 浣跨敤鍙嶅皠璋冪敤琚唬鐞嗗璞$殑鏂规硶
result := reflect.ValueOf(p.realSubject).MethodByName("Do").Call(nil)[0].String()
// 鍦ㄥ鐞嗗悗鐨勯澶栨搷浣?/span>
fmt.Println("Proxy: after handling request")
return result
}
func main() {
realSubject := &RealSubject{}
proxy := &Proxy{realSubject: realSubject}
result := proxy.Do()
fmt.Println(result)
}
鍦ㄤ笂闈㈢殑浠g爜涓紝棣栧厛瀹氫箟浜嗕竴涓?code>Subject鎺ュ彛锛岃鎺ュ彛鏈変竴涓?code>Do鏂规硶銆傜劧鍚庯紝鍒涘缓浜嗕竴涓?code>RealSubject瀵硅薄鏉ュ疄鐜拌鎺ュ彛锛屽苟瀹炵幇浜?code>Do鏂规硶銆?/p>
鎺ヤ笅鏉ワ紝鍒涘缓浜嗕竴涓?code>Proxy瀵硅薄锛岃瀵硅薄鍖呭惈涓€涓寚鍚?code>RealSubject瀵硅薄鐨勫紩鐢ㄣ€?code>Proxy瀵硅薄瀹炵幇浜?code>Subject鎺ュ彛锛屽綋璋冪敤Do
鏂规硶鏃讹紝浼氬厛鎵ц涓€浜涢澶栫殑鎿嶄綔锛岀劧鍚庝娇鐢ㄥ弽灏勮皟鐢ㄨ浠g悊瀵硅薄鐨?code>Do鏂规硶锛屽苟鏈€缁堣繑鍥炵粨鏋溿€?/p>
鍦?code>main鍑芥暟涓紝鍒涘缓浜嗕竴涓?code>RealSubject瀵硅薄鍜屼竴涓?code>Proxy瀵硅薄锛屽苟璋冪敤浜?code>Proxy瀵硅薄鐨?code>Do鏂规硶锛岃緭鍑轰簡鏈€缁堢殑缁撴灉銆?/p>
相关问答