代理模式是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对象,可以在不改变实际对象代码的前提下,增加额外的功能操作,如访问控制、延迟初始化、日志记录等。
下面是一个使用Go语言实现的代理模式示例。我们将创建一个简单的银行账户系统,其中BankAccount
是实际对象,BankAccountProxy
是代理对象。
package main
import (
"fmt"
"time"
)
// Subject接口定义了RealSubject和Proxy共有的方法
type BankAccount interface {
Deposit(amount float64)
Withdraw(amount float64) bool
GetBalance() float64
}
// RealSubject实现了BankAccount接口
type RealBankAccount struct {
balance float64
}
func (r *RealBankAccount) Deposit(amount float64) {
r.balance += amount
fmt.Printf("Deposited: $%.2f\n", amount)
}
func (r *RealBankAccount) Withdraw(amount float64) bool {
if r.balance >= amount {
r.balance -= amount
fmt.Printf("Withdrew: $%.2f\n", amount)
return true
}
return false
}
func (r *RealBankAccount) GetBalance() float64 {
return r.balance
}
// Proxy也实现了BankAccount接口
type BankAccountProxy struct {
account *RealBankAccount
}
func NewBankAccountProxy() *BankAccountProxy {
return &BankAccountProxy{account: &RealBankAccount{}}
}
func (p *BankAccountProxy) Deposit(amount float64) {
p.account.Deposit(amount)
}
func (p *BankAccountProxy) Withdraw(amount float64) bool {
fmt.Println("Logging the transaction...")
time.Sleep(2 * time.Second) // Simulate delay in logging
return p.account.Withdraw(amount)
}
func (p *BankAccountProxy) GetBalance() float64 {
fmt.Println("Getting balance with proxy...")
return p.account.GetBalance()
}
func main() {
proxy := NewBankAccountProxy()
proxy.Deposit(100)
fmt.Println("Balance: $%.2f", proxy.GetBalance())
proxy.Withdraw(30)
fmt.Println("Balance: $%.2f", proxy.GetBalance())
}
在这个示例中,BankAccount
接口定义了银行账户的基本操作。RealBankAccount
是实际的银行账户对象,实现了BankAccount
接口。BankAccountProxy
是代理对象,也实现了BankAccount
接口,并包含了对RealBankAccount
的引用。
在BankAccountProxy
的方法中,我们在调用实际对象的方法前后添加了额外的处理,如日志记录和延迟。这样,客户端可以通过代理对象间接访问实际对象,同时享受到代理提供的额外功能。使用代理模式来控制对实际对象的访问,并在不改变实际对象代码的前提下,增加额外的功能操作。
如果您喜欢我的文章,请点击下面按钮随意打赏,您的支持是我最大的动力。
最新评论