接下来我将详细讲解“Go语言设计模式之实现观察者模式解决代码臃肿”的攻略。
什么是观察者模式?
观察者模式是一种软件设计模式,它定义了对象如何聚合以便其他对象可以订阅它们的变化。具体来说,当被观察者对象的某个状态发生变化时,观察者对象会得到通知,并根据相应的通知进行相应的操作。
观察者模式的实现
观察者接口
首先,我们需要定义一个观察者接口,该接口包含一个Update()
方法,用于接收被观察者对象通知时的相应操作。
// 观察者接口
type Observer interface {
Update()
}
被观察者对象
接下来,我们定义一个被观察者接口Subject
,包含添加观察者和删除观察者的方法,以及通知观察者的方法Notify()
。
// 被观察者接口
type Subject interface {
Attach(obs Observer) // 添加观察者
Detach(obs Observer) // 删除观察者
Notify() // 通知观察者
}
然后,我们实现一个具体的被观察者对象Stock
,它的状态为股票价格。
// 股票类
type Stock struct {
price float32 // 股票价格
observers []Observer // 观察者列表
}
// 添加观察者
func (s *Stock) Attach(obs Observer) {
s.observers = append(s.observers, obs)
}
// 删除观察者
func (s *Stock) Detach(obs Observer) {
for i, o := range s.observers {
if o == obs {
s.observers = append(s.observers[:i], s.observers[i+1:]...)
return
}
}
}
// 通知观察者
func (s *Stock) Notify() {
for _, obs := range s.observers {
obs.Update()
}
}
// 设置股票价格
func (s *Stock) SetPrice(price float32) {
s.price = price
s.Notify() // 价格变化时通知观察者
}
在股票价格变化时,我们通过Notify()
方法通知所有的观察者。下面是一个简单的观察者实现。
观察者实现
// 股票观察者
type StockObserver struct {
name string // 观察者名称
stock *Stock // 股票类
}
// 创建一个新的股票观察者
func NewStockObserver(name string, stock *Stock) *StockObserver {
return &StockObserver{
name: name,
stock: stock,
}
}
// 实现Observer接口
func (s *StockObserver) Update() {
fmt.Printf("%s 收到股票价格变化通知,价格为 %.2f\n", s.name, s.stock.price)
}
在Update()
方法中,我们输出股票价格的变化信息。
示例1:股票价格变化示例
下面是一个股票价格变化的示例,具体代码如下:
func main() {
stock := &Stock{}
observerA := NewStockObserver("小明", stock)
observerB := NewStockObserver("小红", stock)
stock.Attach(observerA)
stock.Attach(observerB)
stock.SetPrice(10.0)
stock.SetPrice(12.5)
stock.SetPrice(14.0)
stock.Detach(observerB)
stock.SetPrice(15.5)
}
运行结果:
小明 收到股票价格变化通知,价格为 10.00
小红 收到股票价格变化通知,价格为 10.00
小明 收到股票价格变化通知,价格为 12.50
小红 收到股票价格变化通知,价格为 12.50
小明 收到股票价格变化通知,价格为 14.00
小红 收到股票价格变化通知,价格为 14.00
小明 收到股票价格变化通知,价格为 15.50
在这个示例中,我们展示了如何创建一个股票对象,并添加两个观察者。当股票价格变化时,股票对象会通知所有观察者。
示例2:使用观察者模式实现邮件订阅功能
下面是一个使用观察者模式实现邮件订阅功能的示例,具体代码如下:
func main() {
mailSubject := &MailSubject{}
observerA := NewMailObserver("小明", mailSubject)
observerB := NewMailObserver("小红", mailSubject)
mailSubject.Attach(observerA)
mailSubject.Attach(observerB)
mailSubject.Notify("这是一封测试邮件。")
mailSubject.Detach(observerB)
mailSubject.Notify("这又是一封测试邮件。")
}
在这个示例中,我们首先定义了一个邮件主题对象MailSubject
,并实现了Attach()
、Detach()
和Notify()
方法。然后我们通过NewMailObserver()
函数创建两个邮件观察者,每个观察者都设置了对应的邮件主题。当邮件主题发送邮件时,观察者会接收到相应的邮件信息。
攻略总结
在本文中,我们详细讲解了如何使用观察者模式解决代码臃肿的问题。具体来说,我们创建了一个观察者接口和一个被观察者接口,然后定义了一个具体的股票类作为被观察者,以及一个股票观察者作为观察者。最后,我们演示了如何使用观察者模式实现邮件订阅功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言设计模式之实现观察者模式解决代码臃肿 - Python技术站