设计模式 | 再理解一下观察者模式

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.");}}}


 

输出结果


以上是关于设计模式 | 再理解一下观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

JS设计模式-观察者模式

java 观察者模式

深入理解观察者模式

Android中观察者模式的升入理解

设计模式之单例模式

无法理解观察者模式中的一些代码