【设计模式】观察者模式

6 篇文章 0 订阅
6 篇文章 0 订阅
观察者模式 是定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

背景:
为了降低耦合,有了观察者模式!
书上的例子发展历程,如下图:




1、因为秘书类通知的是看股票类,增加看NBA者后,秘书类也需要修改,这样一来,就太麻烦了。为了降低耦合,让秘书类的参数为抽象的观察者,那就可以随意增加观察者了。
2、不仅秘书是通知者,还有老板,所以,秘书类也需要抽象为通知者类。

    通知者类和观察者类是两个抽象类(或接口),其中当通知者发出通知后,所有的观察者都需要改变状态;通知者依赖观察者。
提炼出应用场景:1、   一个对象改变需要同时改变其他对象(具体有多少对象不知道);2、两个抽象模型,其中一方依赖另一方面。

优点:降低耦合;
缺点:万一没有观察者,通知者的方法无法实现;
原则:依赖倒转原则;

委托可以很好的避免上述缺点:
原先的Notify依赖observer:
public void  Notify()
{
    foreach(Observer o in observers)
        o.Update();
}
委托后,什么也不依赖:
public void Notify()
{
    Update();//Update为声明的委托事件的名字
}


什么是委托?
delegate void EventHandler(); //声明的委托
public event EventHandler Update;//声明的委托变量
委托是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具有完全心相通的行为。
如:huhansan.Update+=new EventHandler(tongshi1.CloseStockMarket);
实例化一个委托,然后把同事1的关闭股票的方法分配给这个实例化的委托,那么该委托将具有完全相同的方法,然后,把这个方法给胡汉三的委托。

问题:观察者模式中通知者和观察者应该写为抽象类还是接口呢?
要想回答这个问题,首先应该知道什么是抽象类,什么是接口,及其区别。
抽象类和接口?
抽象类表示的是:这个对象是什么?如:猫、狗抽象为“动物'。
接口表示的是:这个对象能做什么?如:猫能叫、狗也可以叫,把“叫”抽象为接口。
区别
1、接口中只能有抽象方法;而抽象类可以有非抽象方法,并且可以实现部分功能;
2、一个类可以继承多个接口,但只能继承一个抽象类;

感受:在学习设计模式的过程中,慢慢的体会出软件设计中应该考虑哪些问题,怎么让程序易维护、复用、扩展、灵活。我想当我们学习完设计模式以后,不一定会记住多少具体的设计模式,但是,我们会潜移默化的会使用这些模式中的小想法、小原则。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值