代理模式(Proxy pattern)
-核心作用:
通过代理,控制对对象的访问!
可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法方法做后置处理。
AOP(Aspect Oriented Promarmming面向切片编程)的核心实现机制。
- 核心角色:
a.抽象角色
-定义代理角色和真实角色的公共对外的方法
b.真实角色
- 实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
- 关注真正的业务逻辑
c.代理角色
- 实现抽象色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象对象方法,并可以附加自己的操作。
- 将统一的流程控制放到代理角色中处理。
应用场景:
a. 安全代理:屏蔽对真实角色的直接访问
b. 远程代理:通过代理类处理远程方法调用(RMI)
c. 延迟加载:通过加载轻量级的代理对象,真正需要再加载真实的对象
分类:
静态代理(静态定义代理类)
动态代理(动态生成代理类)
package staticProxy
import "fmt"
type Star interface {
//面谈
Confer()
//签合同
SignContract()
//订票
BookTicket()
//唱歌
Sing()
//收钱
CollectMoney()
}
type RealStar struct {
Name string
}
func NewRealStar(name string) Star {
return &RealStar{Name: name}
}
//面谈
func (this *RealStar)Confer(){
fmt.Printf("%s---->面谈\n",this.Name)
}
//签合同
func (this *RealStar)SignContract(){
fmt.Printf("%s---->签合同\n",this.Name)
}
//订票
func (this *RealStar)BookTicket(){
fmt.Printf("%s---->订票\n",this.Name)
}
//唱歌
func (this *RealStar)Sing(){
fmt.Printf("%s---->唱歌\n",this.Name)
}
//收钱地
func (this *RealStar)CollectMoney(){
fmt.Printf("%s---->收钱\n",this.Name)
}
type Proxy struct {
Name string
star Star
}
func NewProxy(name string,star Star) Star {
return &Proxy{Name: name,star: star}
}
//面谈
func (this *Proxy)Confer(){
fmt.Printf("%s---->面谈\n",this.Name)
}
//签合同
func (this *Proxy)SignContract(){
fmt.Printf("%s---->签合同\n",this.Name)
}
//订票
func (this *Proxy)BookTicket(){
fmt.Printf("%s---->订票\n",this.Name)
}
//唱歌
func (this *Proxy)Sing(){
this.star.Sing()
}
//收钱地
func (this *Proxy)CollectMoney(){
fmt.Printf("%s---->收钱\n",this.Name)
}
package staticProxy
import(
"testing"
)
func Test_Proxy(t *testing.T){
star := NewRealStar("周杰伦")
proxy := NewProxy("A代理",star);
proxy.Confer()
proxy.SignContract()
proxy.BookTicket()
proxy.Sing()
proxy.CollectMoney()
}
//result
go test -v
=== RUN Test_Proxy
A代理---->面谈
A代理---->签合同
A代理---->订票
周杰伦---->唱歌
A代理---->收钱
--- PASS: Test_Proxy (0.00s)
PASS
ok mlemon_ssh/factory/proxy/staticProxy 0.394s
2静态代理模式-golang
最新推荐文章于 2024-05-02 15:16:21 发布