定义对象间一种一对多的依赖关系,每当一个对象改变状态时,则所有依赖与它的对象都会得到通知并被自动更新。
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护,扩展和重用都带来不便。
老板来公司时,通知玩游戏,看股票,学习的同事赶紧工作!
Class PHA.YX.Design.Observer.Observer Extends %RegisteredObject [ Abstract ]
{
Property name As %String;
Property sub As Subject;
Method %OnNew(name As %String, sub As Subject) As %Status [ Private, ServerOnly = 1 ]
{
s $this.name=name
s $this.sub=sub
Quit $$$OK
}
Method Update() [ Abstract ]
{
}
}
Class PHA.YX.Design.Observer.StockObserver Extends Observer
{
Method %OnNew(name As %String, sub As Subject) As %Status [ Private, ServerOnly = 1 ]
{
s $this.name=name
s $this.sub=sub
Quit $$$OK
}
Method Update()
{
w ..sub.subjectState _""_ ..name _ ",关闭股票行情,继续工作!"
}
}
Class PHA.YX.Design.Observer.GameObserver Extends Observer
{
Method %OnNew(name As %String, sub As Subject) As %Status [ Private, ServerOnly = 1 ]
{
s $this.name=name
s $this.sub=sub
Quit $$$OK
}
Method Update()
{
w ..sub.subjectState _""_ ..name _ ",赶紧关闭玩游戏了,继续工作!"
}
}
Class PHA.YX.Design.Observer.StudyObserver Extends Observer
{
Method %OnNew(name As %String, sub As Subject) As %Status [ Private, ServerOnly = 1 ]
{
s $this.name=name
s $this.sub=sub
Quit $$$OK
}
Method Update()
{
w ..sub.subjectState _""_ ..name _ ",别学习了,继续工作!"
}
}
Class PHA.YX.Design.Observer.Subject Extends %RegisteredObject
{
Method Attach(observer As Observer)
{
}
Method Detach(observer As Observer)
{
}
Method Notify()
{
}
Property subjectState As %String;
Method subjectStateGet() As %String [ ServerOnly = 1 ]
{
Quit i%subjectState
}
Method subjectStateSet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%subjectState=Arg
Quit $$$OK
}
}
Class PHA.YX.Design.Observer.Boss Extends Subject
{
Property observers As list Of Observer;
Property action As %String;
Method Attach(observer As Observer)
{
d ..observers.Insert(observer)
}
///考虑如何用键值对的值来删除对应数组数据
Method Detach(observer As Observer)
{
d ..observers.RemoveAt(observer)
}
Method Notify()
{
f i = 1 : 1 : ..observers.Count() d
.d ..observers.GetAt(i).Update()
.w !
}
}
/// d ##class(PHA.YX.Design.Program).Observer()
ClassMethod Observer()
{
#dim mBoss as PHA.YX.Design.Observer.Boss
s mBoss = ##class(PHA.YX.Design.Observer.Boss).%New()
#dim mStockObserver as PHA.YX.Design.Observer.StockObserver
s mStockObserver = ##class(PHA.YX.Design.Observer.StockObserver).%New("马玉强", mBoss)
#dim mGameObserver as PHA.YX.Design.Observer.GameObserver
s mGameObserver = ##class(PHA.YX.Design.Observer.GameObserver).%New("丁竑莹", mBoss)
#dim mStudyObserver as PHA.YX.Design.Observer.StudyObserver
s mStudyObserver = ##class(PHA.YX.Design.Observer.StudyObserver).%New("云海宝", mBoss)
d mBoss.Attach(mStockObserver)
d mBoss.Attach(mGameObserver)
d mBoss.Attach(mStudyObserver)
s mBoss.subjectState = "老板回来了!"
d mBoss.Notify()
w "删除其中一个",!
d mBoss.Detach(3)
d mBoss.Notify()
}
DHC-APP>d ##class(PHA.YX.Design.Program).Observer()
老板回来拉!马玉强,关闭股票行情,继续工作!
老板回来拉!丁竑莹,赶紧关闭玩游戏了,继续工作!
老板回来拉!云海宝,别学习了,继续工作!
删除其中一个
老板回来拉!马玉强,关闭股票行情,继续工作!
老板回来拉!丁竑莹,赶紧关闭玩游戏了,继续工作!
思考
模拟微信,微博,QQ用户,通知张无忌结婚了。感兴趣的同学实现后可以发我一起参考下。