虽然,工作中不使用任何设计模式,写一个包含1000行代码的函数,并不会有什么问题。但我现在开始觉得,如果在写代码前能思考、套用一些模式的话,我们的思考会更有深度。
开发中经常会遇到的场景:在一个函数体中,我们总是需要在完成核心功能之后,再附加完成一些别的功能。
拿电子书的场景举例,在用户付款成功后,核心的操作就是:交付权益。但我们往往还会有别的附加操作,比如:
- 通知推荐平台,上报用户购买的数据,用于后续个性化推荐
- 通知结算平台、上报用户购买的数据,用于公司收支结算
很多人都习惯在函数末尾加上一堆这样的逻辑,也包括我自己。但其实,我们可以把代码写的更优雅。
观察者模式非常适合这种通知的场景,我们首先定义观察主体,它提供了3个方法,注册观察者、删除观察者、通知所有注册的观察者。
type Subject struct {
List map[string]Observer
}
func (subject *Subject) Attach (obj Observer, identify string) {
subject.List[identify] = obj
}
func (subject *Subject) Del ( identify string) {
delete(subject.List[identify])
}
// 通知所有观察者
func (subject *Subject) NotifyAllObservers(info string) {
for identify, obs := range subject.List {
if err := obs.Update(info); err != nil {
}
}
}
下面定义观察者,观察者统一实现Observer
接口
type Observer interface {
// 简化参数
Update(info string) error
}
// 实现第一个观察者
type LikeObserver struct {
Identify string
}
func (likeObs *LikeObserver) Update(info string) error {
return nil
}
整个过程其实挺简单的,有时候,可能我们是太心急,结果,把耐心思考给省略了。再有时候想想,堆砌代码一点用都没有,真不如好好思考思考。