大话设计模式观后感之行为型设计模式
观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象
同时监听某一个主题对象。这个主题对象在状态发生变化时,
会通知所有观察者对象,使它们能够自动更新自己。
例子
抽象通知接口
Boss实例
抽象观察者
具体观察者的实现
观察者缺点
尽管已经用了依赖倒转原则,但是. 抽象通知者’还是依赖. 抽象观察
者’,也就是说,万一没有了抽象观察者这样的接口,我这通知的功能就完不成了。另外就是每个具体观察者,它不-定是‘更新’的方法要调用呀,就像刚才说的,我希望的是‘工具箱’是隐藏,. 自动窗口’
是打开,这根本就不是同名的方法。这应该就是不足的地方吧。
解决方案–事件委托
委托就是一种引用方法的类型。-旦为委托分配了方法,.委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。
委托可以看作是对函数的抽象,是函数的‘类’, 委托的实例将代表一个具体的函数。
一个委托可以搭载多个方法,所有方法被依次唤起 更重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。
但委托也是有前提的,那就是委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
消除了观察者抽象类,在客户端进行灵活的调用不同类的相关具有相同参数和返回值的不同名函数,实现解耦。
观察者的具体实现
通知者接口
声明委托
委托可以定义在类里面,类外面,也可以在命名空间下,根据不同的需要来确定委托方法的使用范围。
通知者的实现
客户端灵活调用
事件关键字的使用
在委托类型前加上event 代表声明事件。否则是声明委托。
事件只能对委托进行加减不能进行赋值
1 | delegate void EventHandle() |
对于接口和抽象类
接口成员
属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员
C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单,接口里面的方法都需要由外面接口实现去实现方法体,那么其修饰符必然是 public。C# 接口中的成员默认是 public 的,java 中是可以加 public 的。