Golang设计模式之代理模式

代理模式

代理模式是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对象,可以在不改变实际对象代码的前提下,增加额外的功能操作,如访问控制、延迟初始化、日志记录等。

代理模式中的角色

  • Subject(主题):定义了RealSubject和Proxy共有的接口,这样代理可以用来代替实际对象。
  • RealSubject(实际对象):定义了代理所代表的真实对象,实现了Subject接口,含有真实的业务逻辑。
  • Proxy(代理):包含对RealSubject的引用,实现了与RealSubject相同的接口,并在访问RealSubject之前或之后添加额外的处理。

Go示例

下面是一个使用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的方法中,我们在调用实际对象的方法前后添加了额外的处理,如日志记录和延迟。这样,客户端可以通过代理对象间接访问实际对象,同时享受到代理提供的额外功能。使用代理模式来控制对实际对象的访问,并在不改变实际对象代码的前提下,增加额外的功能操作。

打 赏