【大话】之观察者模式

起因: 
 
     最近在学习的一本书《大话设计模式》。这本书给每个设计模式都加上了一个例子,可以让学习更加的简单又有趣。学了一段时间,给别人讲的时候发现自己记下了不少的东西。其实这也是老师强调的一种学习方法-----把每个知识变成自己的故事。那么来总结一下到我学到现在,有点混乱的一个模式——观察者模式。


描述:


   在公司工作的时候总是想看看自己投资的股票怎么样了,是赚了还是赔了。但是问题来了:老板来了发现了怎么办?于是提出一个解决办法:让前台的秘书看着点,老板来的时候就给我们一个通知:“老板来了,停止炒股!”但是今天小菜的同事却没有那么幸运了,正好在讨论股票的时候被老板逮了一个正着。原来啊,老板来了以后给前台的秘书派了任务,因此秘书没有来得及通知导致这个下场!也因此大鸟从这个日常发生的事件中得到了一个模式-----观察者模式。


理解: 


       在这个故事中有两个通知者,一个是老板一个是秘书。那么我们可以把他们归为一个类。但是同时这两个类又有着不同的通知方法。所以为了尽量增加代码的复用程度,我们就把通知者的类改成了一个借口,在这个借口中只是定义方法,而具体的怎么实现可以让继承这个接口的(subject)通知类(在例子中相当于boss类和secretary类)去完成。 

分析故事我们还知道这里有一个被通知者(观察者类),他们得把自己需要被通知的想法告诉通知者。并且随着通知者状态的改变而改变。那么这个被通知者就可以独立出来一个类。但是被通知者有好多并且他们都是为了一个目的----(在通知者类消息通知来的时候更新自己的状态)。那么为了满足开放封闭原则,我们必须减少类与类之间的耦合,那么这个被通知者类就得设计成抽象类(或者接口),让具体的每一个同事类去继承这个抽象类。这样当通知者得到信息,并且更新状态的时候,同事类也就可以根据信息去更新自己的状态,而且同事类根本不需要知道是谁通知的,而且通知者也不需要知道有哪些同事类,只需要改变状态就行。

 
  
规范:
        
        观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
观察者模式其实就是在接触类之间的耦合,使耦合的双方都依赖于抽象,而不是依赖于具体,因而两边的变化都不会互相影响。
当一个对象的改变需要同时改变其他对象的时候可以考虑应用观察者模式。


不足:


      虽然通知者类和被通知者类之间没有了关系,但是他们的接口(在这里是抽象类)之间还是有联系的,并且万一没有了这些接口,这些子类(boss类,secretary类,观察者类)就不能实现他们的功能了。那么我们就需要改进我们的模式。


改进:   

    

改进的方法就是应用“委托”。委托可以看做是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

需要注意的是:一个委托可以搭载多个方法,并且这些方法并不需要同属于一个类。但是这些方法必须具有相同的原形和形式,就是拥有相同的参数列表和返回值类型。        

例如:声明一个委托:delegate void EventHandler():可以看做一个类

                   public event EventHandler Update;声明一个事件update,类型为委托EventHandler。即声明了一个事件委托变量。

例如:huhansan.Update+=new EventHandler(tongshi1.CloseStockMarket);其实就是tongshi1.CloseStockMarket这个方法委托给了huhansan.Update这个方法。那么这两个方法就会一模一样!

 

用个实际的例子来说吧:比如说:你的一个同学委托你通过群发把他的手机号给你们班的所有人。这就是委托和观察者模式的结合应用,而你就是那个接口(抽象类)。而你的这个同学和其他的同学不用互相知道就可以更新状态。


对于这个模式还是有点小的迷糊,弄不清关系,总结梳理了一下,不一定正确,欢迎大家来指正!










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值