文章目录
  1. 1. 实现观察者模式

观察者(Observer)设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。观察者模式将观察者和被观察的对象分离开,体现了面向对象设计中一个对象只做一件事情的原则,提高了应用程序的可维护性和重用性。

实现观察者模式

观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者(Observer)和被观察对象(Subject)。

observer_pattern

  • 观察者
    观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

  • 被观察
    被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者(notifyObservers)。

  • 撤销观察
    观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
    观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,它可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
    下面通过构建一个股民(Observer)和他们关注的某支具体股票(Subject)案例分析,
    首先观察者(Observer)要能注册/注销到某个被观察者(Subject)中,同时被观察者(Subject)发送变化时要能够通知到依赖它的观察者(Observer),由此我们需要声明一个被观察者(Subject)的接口:

    1
    2
    3
    4
    5
    6
    // subject被观察者接口
    type Subject interface {
    Attach(Observer)
    Detach(Observer)
    Notify()
    }

    遵循被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口的原则,当被观察者(Subject)因自身改变通知观察者(Observer)改变时,应提供一个观察者(Observer)接口供被观察者(Subject)调用:

    1
    2
    3
    4
    // observer观察者
    type Observer interface {
    Update(Subject, interface{}) //更新
    }

    接口设计好之后,就需要通过具体的对象来实现这些接口,在这个案例中假定股民关注的是中国石油这只股票,那么股票就是观察者(Observer),而中国石油股票则是被观察者(Subject),具体结构如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 具体observer观察者
    type Investors struct {
    /*投资人*/
    }

    // 具体subject被观察者
    type ChinaPetroleum struct {
    oblist []Observer //注册者链表
    }

作者署名:朴实的一线攻城狮
本文标题:golang 设计模式之observer使用总结
本文出处:http://researchlab.github.io/2016/02/26/observer-pattern-in-go-md/
版权声明:本文由Lee Hong创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处, 否则保留追究法律责任的权利。

@一线攻城狮

关注微信公众号 @一线攻城狮

总访问:
总访客: