简明的观察者模式

  

什么是观察者模式?

  观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。由于C#实现了很好的委托机制,因此实现起来简单明了,通俗易懂。

如何实现观察者模式呢?

  观察者模式包含两个主题:观察者与被观察者。当被观察者发出我们关注的信号时观察者们做出自己的一系列行为。

假如我们有一个这么的需求:狗叫了->老鼠逃窜了,主人惊醒了,猫咪听到了并且开始追老鼠。首先我们可以知道信号是狗发出的接着产生了连锁反应而老鼠和主人都是单一行为喵咪有两个行为,主要需求信息就这么多。接下来开始撸代码了。

1,我们先定义一个抽象主题(被观察者)类,用来处理观察者的注册事件。

/// <summary>
/// 抽象主题类
/// </summary>
public abstract class Subject
{
	public event SubEventHander subEventHander;
	public void FireAway()
	{
		if (subEventHander != null)
		{
			subEventHander();
		}
	}
}

2,接下来定义一个观察者抽象类

public abstract class Observer
{
	/// <summary>
	/// 订阅主题消息
	/// </summary>
	/// <param name="sub"></param>
	public Observer(Subject sub)
	{
		sub.subEventHander += new SubEventHander(Response);
	}
	/// <summary>
	/// 观察者的行为实现
	/// 继承类可以重写自己的行为
	/// </summary>
	public abstract void Response();
}

3,下面就是实现狗,老鼠,人,猫的动作行为了。我们要分清谁该继承那个抽象类。显然狗是信号的发出者,毫无疑问狗继承自Subject,其它继承自Observer类。

实现如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Observer_Pattern
{
	class Program
	{
		/// <summary>
		/// 声明事件处理为委托
		/// </summary>
		public delegate void SubEventHander();

		/// <summary>
		/// 抽象主题类
		/// </summary>
		public abstract class Subject
		{
			public event SubEventHander subEventHander;
			public void FireAway()
			{
				if (subEventHander != null)
				{
					subEventHander();
				}
			}
		}

		#region 主题类
		/// <summary>
		/// 主题信号源
		/// </summary>
		public class Dog:Subject
		{
			private string name;

			public Dog(string Name)
			{
				this.name = Name;
			}
			/// <summary>
			/// 信号发出
			/// </summary>
			public void Shout()
			{
				Console.WriteLine("我是"+name+",发现一群老鼠汪汪汪,,,\n");
				this.FireAway();
			}
		}
		#endregion

		#region  单行为观察类
		/// <summary>
		/// 观察者的抽象类
		/// </summary>
		public abstract class Observer
		{
			/// <summary>
			/// 订阅主题消息
			/// </summary>
			/// <param name="sub"></param>
			public Observer(Subject sub)
			{
				sub.subEventHander += new SubEventHander(Response);
			}
			/// <summary>
			/// 观察者的行为实现
			/// 继承类可以重写自己的行为
			/// </summary>
			public abstract void Response();
		}

		/// <summary>
		/// 观察者
		/// </summary>
		public class Mouse:Observer
		{
			private string name;
			public Mouse(string Name, Subject sub): base(sub)
			{
				name = Name;
			}
		    public override void Response()
			{
				Console.WriteLine(name+"逃跑了,,,,");
			}
		}

		public class Monster : Observer
		{
			private string name;
			public Monster(string Name,Subject sub):base(sub)
			{
				name = Name;
			}
			public override void  Response()
			{
				Console.WriteLine();
				Console.WriteLine(name + "惊醒了,,,,");
			}
		}
		#endregion

		#region 多行为观察者
		public abstract class Observe2
		{
			public Observe2(Subject sub)
			{
				sub.subEventHander += new SubEventHander(Resonse1);
				sub.subEventHander += new SubEventHander(Resonse2);
			}
			public abstract void Resonse1();
			public abstract void Resonse2();
		}

		public class Cat : Observe2
		{
			private string name;
			public Cat(string Name, Subject sub): base(sub)
			{
				name = Name;
			}
			public override void Resonse1()
			{
				Console.WriteLine();
				Console.WriteLine(name+"喵喵喵,,,");
			}
			public override void Resonse2()
			{
				Console.WriteLine(name + "开始逮老鼠,,,");
			}
		}
		#endregion

		static void Main(string[] args)
		{
		        Dog dog = new Dog("小花狗");
			Mouse mouse1 = new Mouse("锦毛鼠", dog);
			Mouse mouse2 = new Mouse("小白鼠", dog);
			Monster monster = new Monster("女主人", dog);

			Cat cat = new Cat("小花猫",dog);

			dog.Shout();

			Console.ReadLine();
		}
	}
}

4,运行一下吧,

总结:设计模式真的很经典,开始我们可能并不能理解为什么要这样设计,代码为什么要这么来写,这个阶段我们只要知道这么设计是有道理的。

当我们有一定的项目经验后会这么认为:"嗯,确实就是该这么设计的”。因为我们自己的内功还不行,努力修炼。

项目地址:https://git.oschina.net/wuzhang/Observer-Pattern.git

  

  

时间: 2024-08-29 02:57:09

简明的观察者模式的相关文章

观察者模式

观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现. 观察者 (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(List)里. 被观察者 被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者. 代码实例: //被观察者接口 public interface Subject { void add(Observer observer

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

【非凡程序员】 OC第十五节课 (观察者模式和KVO进行对比)

今天主要学了观察者模式,以及回顾复习了KVO,两者进行对比 什么是观察者模式? 我们先打个比方,这就像你订报纸.比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态.其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式 KVO的全称是Key-Value Observer,

php实现观察者模式

<meta charset='utf-8' /> <title>观察者模式</title> <?php class Tongzhi implements SPLSubject { protected $subs = array(); public $username = '我是被观察者'; public function __construct(){ } public function attach(SPLObserver $sub){ $this->sub

Lisp简明教程

此教程是我花了一点时间和功夫整理出来的,希望能够帮到喜欢Lisp(Common Lisp)的朋友们.本人排版很烂还望多多海涵! <Lisp简明教程>PDF格式下载 <Lisp简明教程>ODT格式下载 具体的内容我已经编辑好了,想下载的朋友可以用上面的链接.本人水平有限,如有疏漏还望之处(要是有谁帮我排排版就好了)还望指出!资料虽然是我整理的,但都是网友的智慧,如果有人需要转载,请至少保留其中的“鸣谢”页(如果能有我就更好了:-)). Lisp简明教程 整理人:Chaobs 邮箱:[

浅谈java中内置的观察者模式与动态代理的实现

一.关于观察者模式 1.将观察者与被观察者分离开来,当被观察者发生变化时,将通知所有观察者,观察者会根据这些变化做出对应的处理. 2.jdk里已经提供对应的Observer接口(观察者接口)与Observable(被观察者类)用于实现观察者模式 3.关于Observer接口,该接口只有一个update方法,当被观察者发生相关变化时,会通知所有的观察者,观察者接受到通知时,调用update方法进行处理.贴出源代码: 1 /* 2 * Copyright (c) 1994, 1998, Oracle

【设计模式】 观察者模式

1.定义 1.1 标准定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式,其定义如下:Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使

《JAVA与模式》之观察者模式

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式的结构 一个软件系统里面包含了各种对象,就像一片欣欣向荣的森林充满了各种生物一样.在一片森林中,各种生物彼此依赖和约束

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-