设计模式 | 再理解一下观察者模式
Posted 属老鼠的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 | 再理解一下观察者模式相关的知识,希望对你有一定的参考价值。
在UML类图中,依赖关系被标记为<<use>>。A依赖B表示A调用B暴露出来的接口,主要方式是数据引用和函数调用。
观察者模式(ObserverPattern),指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。又称作发布-订阅模式、模型-视图模式,是一种行为型模式。
上面的描述晦涩难懂,分解一下是这样:
l 存在1个被观察对象和n个观察者对象
l 被观察对象和观察者对象是依赖关系
l 被观察对象有个可以广播的大喇叭,它的变化会通知到所有的观察者
l 观察者根据通知执行相应的方法
在UML类图中,依赖关系被标记为<<use>>。A依赖B表示A调用B暴露出来的接口,主要方式是数据引用和函数调用。
就好比家里添了一个宝贝。小孩(Baby)就是被观察者,进了家门的所有家庭成员(Family Members)就是观察者,小孩的哭声(Cry)就是广播,你跑过去看就是收到通知后的行为(Action)。
关键部分是被观察者必须有一个List用于存放所有的观察者,有“家”的孩子才是宝。家庭成员回到家就加入到Baby的List里面。
实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ObserverPatternDemo
{
class Program
{
static void Main(string[] args)
{
Baby baby = new Baby();
FamilyMember mom = new Mother();
baby.FamilyMembers.Add(mom);
baby.Cry();
Console.WriteLine("--------------------");
Console.WriteLine("Father isback.");
Father dad = new Father();
baby.FamilyMembers.Add(dad);
baby.Cry();
Console.WriteLine("--------------------");
Console.WriteLine("Mother should havea rest.");
baby.FamilyMembers.Remove(mom);
baby.Cry();
Console.Read();
}
}
class Baby
{
public List<FamilyMember>FamilyMembers = new List<FamilyMember>();
public void Cry()
{
Console.WriteLine("Baby iscrying...");
foreach (var member in FamilyMembers)
{
member.action();
}
}
}
abstract class FamilyMember
{
public abstract void action();
}
class Mother:FamilyMember
{
public override void action()
{
Console.WriteLine("Don't cry baby, momis here.");
}
}
class Father : FamilyMember
{
public override void action()
{
Console.WriteLine("Don't cry baby, dadis here.");
}
}
}
输出结果
以上是关于设计模式 | 再理解一下观察者模式的主要内容,如果未能解决你的问题,请参考以下文章