目录
观察者模式
引言
观察者模式是一种经常使用的设计模式,在软件系统中对象并不是孤立存在的,一个对象的行为的改变可能会导致一个或者多个其他与之存在依赖的对象行为发生改变,观察者模式用于描述对象之间的依赖关系。如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行。
模式定义
英文定义:“Define a one-to-many dependency between objects so that when one objec change state,all its dependents are notified and updated automatically”。
中文定义:定义对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆的大奥通知并被自动更新。
观察者式重要等级★★★★★ 观察者模式难度等级★★★☆☆
模式结构图
观察者模式包含如下角色
1)Subject(目标)
2)ConcreteSubject(具体目标)
3) Observer(观察者)
4)ConcreteObserver(具体观察者)
实例
实例说明
假设猫是老鼠和狗的观察目标,猫叫老鼠跑,狗也跟着叫,用观察者模式描述该过程。
实例类图
代码实现
观察者接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
interface MyObserver
{
void Update();
}
具体观察者Mouse
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Mouse : MyObserver
{
public void Update()
{
Console.WriteLine("老鼠逃跑。");
}
}
具体观察者Dog
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Dog : MyObserver
{
public void Update()
{
Console.WriteLine("狗也叫。");
}
}
观察目标Cat
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Cat
{
private List<MyObserver> observers = new List<MyObserver>();
public void Attach(MyObserver observer)
{
observers.Add(observer);
}
public void Detach(MyObserver observer)
{
observers.Remove(observer);
}
public void Cry()
{
Console.WriteLine("猫叫");
Notify();
}
public void Notify()
{
foreach(MyObserver o in observers)
{
o.Update();
}
}
}
测试代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
cat.Attach(new Dog());
cat.Attach(new Mouse());
cat.Cry();
Console.ReadKey();
}
}
运行截图
模式扩展
IObserverable和IObserver接口
观察者模式在编程语言中非常重要,JAVA和C#都提供了相应的接口支持观察者模式。JAVA(Observerable,Observer),C#(IObserver<T>,IObserverable<T>)。我们可以直接使用他们作为观察者模式的抽象层,自定义具体的观察者类和观察目标类。
MVC模式
MVC模式是一种架构模式,它包含三个角色:模型(Model)、视图(View)、和控制器(Controllor)。观察者模式可以用来实现MVC模式,观察者模式中的观察目标就是MVC模式中的模型(Model),而观察者就是MVC中的视图(View),控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时,视图层将自动改变其显示内容。
总结
模式优点
1)观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
2)观察者和观察目标之间的依赖是抽象的。它们可以分别扩展。新增观察者和观察目标都不需要修改原有代码,符合开闭原则。
3)观察者模式在一对多系统设计中发出通知很方便。
模式缺点
1)如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2)如果观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能会导致系统崩溃。
3)观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的,而仅仅知道观察目标发生了变化。