某程序以多种不同的形式展示相同的数据,展示的方式可能是表格、柱状图、饼图等。当数据发生变化时,所有的展示方式都需要同步更新。
你会怎样设计,来灵活应对展示方式的不确定性呢?
分析:
1.不管是怎样的数据展示方式,它们的数据源都是同样的一个。
2.数据发生变化时,数据源是首先知道的,它需要通知所有的数据展示。
3.数据源是必须“知道”数据展示的,否则无法通知它们,通常做法就是数据源保持各数据展示的引用,但这样就被“耦合”掉了,有什么办法可以“解耦”呢?
应用了观察者模式的设计:
说明:
1.Data是数据源,而各数据展示者需实现IObserver接口。
2.Data不需要显式地知道数据展示者,它只需要知道IObserver接口便可。
3.各数据展示者需要主动通过Data.Register()注册,让Data知道自己,而不需要Data知道自己时,可调用Data.Remove()。
4.Data发生数据变化需要通知各数据展示者时,只需要调用Notify()方法便可。
观察者模式 类图 :
说明:
1.Subject定义一个接口,如果谁想关注我,就需要实现这个接口,并且通过Register()方法来注册。
2.如果需要增加观察者者,只需要增加一个实现了IObserver接口的新类并注册到Subject就行了。
你会怎样设计,来灵活应对展示方式的不确定性呢?
分析:
1.不管是怎样的数据展示方式,它们的数据源都是同样的一个。
2.数据发生变化时,数据源是首先知道的,它需要通知所有的数据展示。
3.数据源是必须“知道”数据展示的,否则无法通知它们,通常做法就是数据源保持各数据展示的引用,但这样就被“耦合”掉了,有什么办法可以“解耦”呢?
应用了观察者模式的设计:
说明:
1.Data是数据源,而各数据展示者需实现IObserver接口。
2.Data不需要显式地知道数据展示者,它只需要知道IObserver接口便可。
3.各数据展示者需要主动通过Data.Register()注册,让Data知道自己,而不需要Data知道自己时,可调用Data.Remove()。
4.Data发生数据变化需要通知各数据展示者时,只需要调用Notify()方法便可。
观察者模式 类图 :
说明:
1.Subject定义一个接口,如果谁想关注我,就需要实现这个接口,并且通过Register()方法来注册。
2.如果需要增加观察者者,只需要增加一个实现了IObserver接口的新类并注册到Subject就行了。
3.这样的设计,让主题和观察者实现了一定程度的“解耦”。
请看下一文……