大话设计模式 -观察者模式

今天来写一下观察者模式,文章内容主要是对大话设计模式这本书的整理。

1.观察者模式定义

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

在这里插入图片描述

2.问题引入

  • 员工小a,小b,小c,放弃内卷,决定摸鱼,但又担心老板发现。
  • 员工小d是公司前台,于是小a,b,c寻求小d帮助,一旦老板来公司,就第一时间通知他们。

设计一个结构,实现这一需求。

3.问题分析

  1. 前台小d可以看作一个发布者【publish】,而小a,小b和小c则相当于是一个观察者【observer】。
  2. 当小d观察到老板回来时(状态发生变化),此时通知小a,小b和小c执行各自的update()方法

4.代码实现

  通知者:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

观察者:

在这里插入图片描述
在这里插入图片描述

	代码运行:

在这里插入图片描述

5.总结

5.1  观察者模式适合哪些情况?

当一个对象的改变需要同时改变其它对象,并且不知道具体有多少对象有待改变时应该考虑用观察者模式。

5.2 观察者模式的好处?

避免了为维护一致性而导致的紧密耦合,为维护、扩展和重用带来了方便.

5.3 观察者模式缺点?

抽象通知者依旧依赖抽象观察者,一旦没有抽象观察者,就无法实现自身的update功能。
并且每个具体观察者并不一定是 update 方法的调用,如果需要调用观察者的其它方法,就难以实现。

观察者模式的这些缺点,我们可以使用事件委托来克服。

6.延申-事件委托

6.1 使用委托优化观察者模式的缺点

当观察者有各自不同的功能需求时,代码如下:
在这里插入图片描述
使用委托来实现通知的功能,首先声明一个委托:

delegate void EventHandler();

创建通知者类:
在这里插入图片描述

功能实现:

在这里插入图片描述

6.2 委托介绍
  1. 委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
  2. 委托方法的使用可以像其它任何方法一样,具有参数和返回值。
  3. 委托可以看作是对函数的抽象,是函数的’类’,委托实例将代表一个具体的函数。
  4. 一个委托可以搭载多个方法,所有方法依次唤起。并且可以使委托对象所搭载的方法并不需要同属于一个类。
  5. 委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。

参考:

  1. 《大话设计模式》 -作者: 程杰 出版年: 2007-12-1 出版社: 清华大学出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值