概念:
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
优点
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
- 目标与观察者之间建立了一套触发机制。
缺点
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
模式的结构
抽象主题(Subject)角色: 也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
using System.Collections.Generic;
public abstract class 十字路口
{
public List<观察者> list = new List<观察者>();
//增加方法
public void add(观察者 n)
{
list.Add(n);
}
public abstract void 通知观察者当前行为(int i);
}
具体主题(Concrete Subject)角色: 也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
using System;
public class 红绿灯 : 十字路口
{
public override void 通知观察者当前行为(int i)
{
int z = 0;//记录人数
switch (i)
{
case 1:
Console.WriteLine("当前为红灯");
foreach(var n in list)
{
z++;
Console.Write("第" + z + "位: ");
n.当前红灯的动作();
}
break;
case 2:
Console.WriteLine("当前为绿灯");
foreach (var n in list)
{
z++;
Console.Write("第" + z + "位: ");
n.当前绿灯的动作();
}
break;
}
}
}
抽象观察者(Observer)角色: 它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
public abstract class 观察者
{
public abstract void 当前红灯的动作();
public abstract void 当前绿灯的动作();
}
具体观察者(Concrete Observer)角色: 实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
using System;
public class 司机 : 观察者
{
public override void 当前红灯的动作()
{
Console.WriteLine("汽车停下");
}
public override void 当前绿灯的动作()
{
Console.WriteLine("汽车允许通过");
}
}
using System;
public class 行人 : 观察者
{
public override void 当前红灯的动作()
{
Console.WriteLine("行人开始过马路!");
}
public override void 当前绿灯的动作()
{
Console.WriteLine("行人不能过马路!");
}
}
测试
using System;
class Program
{
static void Main(string[] args)
{
十字路口 m = new 红绿灯();
观察者 n1 = new 行人();
观察者 n2 = new 行人();
观察者 n3 = new 行人();
观察者 c1 = new 司机();
观察者 c2 = new 司机();
m.add(n1);
m.add(n2);
m.add(n3);
m.add(c1);
m.add(c2);
m.通知观察者当前行为(1);
m.通知观察者当前行为(2);
Console.Read();
}
}
输出示例
设计模式------首页