- 浏览: 496350 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
观察者设计模式中存在两种角色: 观察者和被观察者。
最经典的例子就是“猫叫了,老鼠跑了,惊醒了主人。”,这个例子也是我以前去微软面试的时候碰到的一个面试题,当时就是让我设计一下这个过程的实现框架。
在这个例子中,老鼠和主人其实就是观察者,而猫属于被观察者,老鼠和主人观察猫的变化,猫有了动作,老鼠和主人就要做出响应。被观察者,就是这个过程,也可以叫做整个事件的根本原因,亦可以叫直接导火索。
从上面这个例子不难看出,观察者和被观察者的关系通常是n:1,也就是多个多个观察者观察一个被观察者。
这样就给我们一个小小的提示,通过这个提示就可以很容易的找出被观察者。猫,也就是观察的内容,或者观察的被动者,猫所在的角色就是被观察者;老鼠和主人,也就是观察的主体,动作的出发者,他们的角色就是观察者。
当然了,实际的项目中,这个过程肯定没有这么简单,这时候需要我们把大过程,分解成很多的小过程,分层级的找出观察者和被观察者,分层级的使用观察者模式。
下面给出我写的一个完整代码,欢迎大家一起讨论。
完整代码:/Files/virusswb/BeautyCode.DesignPattern.Observer.rar
代码包括两个部分,首先是普通的观察者模式,也就是在被观察者中注册观察者,多个观察者通过一个荣起来管理,然后向观察者发送通知。
普通的观察者模式
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
/// <summary>
/// 观察者接口
/// </summary>
public interface IObserver
{
void Notify(object obj);
}
/// <summary>
/// 被观察者接口
/// </summary>
public interface IObservable
{
void Register(IObserver observer);
void UnRegister(IObserver observer);
void Notify(object obj);
}
class Mouse:IObserver
{
public void Run()
{
}
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},老鼠跑了",obj.ToString()));
}
#endregion
}
class Master:IObserver
{
public void Wake()
{
}
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},主人被惊醒",obj.ToString()));
}
#endregion
}
class Dog : IObserver
{
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},狗拿耗子,多管闲事", obj.ToString()));
}
#endregion
}
class Cat:IObservable
{
private Dictionary<IObserver, IObserver> _observerContainer = new Dictionary<IObserver, IObserver>();
public void Cry()
{
Console.WriteLine("猫叫了");
}
#region IObservable 成员
public void Register(IObserver observer)
{
if (_observerContainer.ContainsKey(observer))
_observerContainer.Remove(observer);
_observerContainer.Add(observer,observer );
}
public void UnRegister(IObserver observer)
{
if (_observerContainer.ContainsKey(observer))
_observerContainer.Remove(observer);
}
public void Notify(object obj)
{
foreach (IObserver o in _observerContainer.Keys)
{
_observerContainer[o].Notify(obj);
}
}
#endregion
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
/// <summary>
/// 观察者接口
/// </summary>
public interface IObserver
{
void Notify(object obj);
}
/// <summary>
/// 被观察者接口
/// </summary>
public interface IObservable
{
void Register(IObserver observer);
void UnRegister(IObserver observer);
void Notify(object obj);
}
class Mouse:IObserver
{
public void Run()
{
}
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},老鼠跑了",obj.ToString()));
}
#endregion
}
class Master:IObserver
{
public void Wake()
{
}
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},主人被惊醒",obj.ToString()));
}
#endregion
}
class Dog : IObserver
{
#region IObserver 成员
public void Notify(object obj)
{
Console.WriteLine(string.Format("{0},狗拿耗子,多管闲事", obj.ToString()));
}
#endregion
}
class Cat:IObservable
{
private Dictionary<IObserver, IObserver> _observerContainer = new Dictionary<IObserver, IObserver>();
public void Cry()
{
Console.WriteLine("猫叫了");
}
#region IObservable 成员
public void Register(IObserver observer)
{
if (_observerContainer.ContainsKey(observer))
_observerContainer.Remove(observer);
_observerContainer.Add(observer,observer );
}
public void UnRegister(IObserver observer)
{
if (_observerContainer.ContainsKey(observer))
_observerContainer.Remove(observer);
}
public void Notify(object obj)
{
foreach (IObserver o in _observerContainer.Keys)
{
_observerContainer[o].Notify(obj);
}
}
#endregion
}
}
第二种是在.NET 框架的基础之上的观察者,也就是事件委托类型的观察者,不需要在被观察者中注册观察者,降低了观察者和被观察者的耦合度。
以事件委托为基础的观察者模式
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
public delegate void ObserverEventHandler(object sender, EventObjectArgs e);
/// <summary>
/// 被观察者
/// </summary>
public interface IEventObserable
{
event ObserverEventHandler ObserverEvent;
void OnObserverEvent(EventObjectArgs e);
void RaiseObserverMethod();
}
/// <summary>
/// 观察者
/// </summary>
public interface IEventObserver
{
}
public class EventObjectArgs : EventArgs
{
private string _message;
public string Message
{
get { return _message; }
}
public EventObjectArgs()
{
}
public EventObjectArgs(string message)
{
this._message = message;
}
}
class EventCat : IEventObserable
{
#region IEventObserable 成员
public event ObserverEventHandler ObserverEvent;
public void OnObserverEvent(EventObjectArgs e)
{
if (null != ObserverEvent)
{
ObserverEvent(this, e);
}
}
public void RaiseObserverMethod()
{
Console.WriteLine("猫叫了");
OnObserverEvent(new EventObjectArgs("猫叫了"));
}
#endregion
}
class EventMouse : IEventObserver
{
public EventMouse() { }
public EventMouse(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了", e.Message));
}
}
class EventDog : IEventObserver
{
public EventDog(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了,但是狗拿耗子多管闲事", e.Message));
}
}
class EventMaster : IEventObserver
{
public EventMaster(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了,但是狗拿耗子多管闲事,主人生气了,要打死这些动物", e.Message));
}
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
public delegate void ObserverEventHandler(object sender, EventObjectArgs e);
/// <summary>
/// 被观察者
/// </summary>
public interface IEventObserable
{
event ObserverEventHandler ObserverEvent;
void OnObserverEvent(EventObjectArgs e);
void RaiseObserverMethod();
}
/// <summary>
/// 观察者
/// </summary>
public interface IEventObserver
{
}
public class EventObjectArgs : EventArgs
{
private string _message;
public string Message
{
get { return _message; }
}
public EventObjectArgs()
{
}
public EventObjectArgs(string message)
{
this._message = message;
}
}
class EventCat : IEventObserable
{
#region IEventObserable 成员
public event ObserverEventHandler ObserverEvent;
public void OnObserverEvent(EventObjectArgs e)
{
if (null != ObserverEvent)
{
ObserverEvent(this, e);
}
}
public void RaiseObserverMethod()
{
Console.WriteLine("猫叫了");
OnObserverEvent(new EventObjectArgs("猫叫了"));
}
#endregion
}
class EventMouse : IEventObserver
{
public EventMouse() { }
public EventMouse(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了", e.Message));
}
}
class EventDog : IEventObserver
{
public EventDog(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了,但是狗拿耗子多管闲事", e.Message));
}
}
class EventMaster : IEventObserver
{
public EventMaster(IEventObserable observable)
{
observable.ObserverEvent += new ObserverEventHandler(observable_ObserverEvent);
}
public void observable_ObserverEvent(object sender, EventObjectArgs e)
{
Console.WriteLine(string.Format("{0},所有老鼠被吓跑了,但是狗拿耗子多管闲事,主人生气了,要打死这些动物", e.Message));
}
}
}
下面是他们的调用代码,是一个Console应用程序
Observer 代码调用
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
public class Model
{
public object ModelState { get; set; }
}
public class Command
{
public void DoCommand()
{ }
}
public class Selection : EventArgs
{
public object State { get; set; }
}
public class Interactor
{
public delegate void AddItemEventHandler(object sender, Selection e);
public event AddItemEventHandler ItemAdded;
protected virtual void OnItemAdded(Selection e)
{
if (ItemAdded != null)
ItemAdded(this, e);
}
public void AddItem(object value)
{
Selection selection = new Selection() { State = value };
OnItemAdded(selection);
}
}
public class Presenter
{
private readonly Command command;
private readonly Interactor interactor;
private readonly Model model;
private readonly View view;
public Presenter(Interactor interactor)
{
this.command = new Command();
this.model = new Model();
this.view = new View();
this.interactor = interactor;
this.interactor.ItemAdded += new Interactor.AddItemEventHandler(interactor_ItemAdded);
}
void interactor_ItemAdded(object sender, Selection e)
{
this.command.DoCommand();
this.model.ModelState = e.State;
this.view.Update ("Processed " + e.State);
}
}
public class View
{
private object ViewState;
static void Main(string[] args)
{
#region Model View Presenter Design Pattern
Interactor interactor = new Interactor();
Presenter presenter = new Presenter(interactor);
interactor.AddItem("Message from the UI");
#endregion
#region 普通观察着模式
Mouse mouse = new Mouse();
Master master = new Master();
Dog dog = new Dog();
Cat cat = new Cat();
cat.Register(mouse);
cat.Register(master);
cat.Register(dog);
cat.Cry();
cat.Notify("猫叫了");
cat.UnRegister(mouse);
cat.UnRegister(master);
cat.UnRegister(dog );
#endregion
#region 基于事件和委托的观察者模式
EventCat eventCat = new EventCat();
EventMouse eventMouse = new EventMouse(eventCat);
EventDog eventDog = new EventDog(eventCat);
EventMaster eventMaster = new EventMaster(eventCat);
eventCat.RaiseObserverMethod();
#endregion
Console.ReadLine();
}
public void Update(object state)
{
ViewState = state;
}
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp
{
public class Model
{
public object ModelState { get; set; }
}
public class Command
{
public void DoCommand()
{ }
}
public class Selection : EventArgs
{
public object State { get; set; }
}
public class Interactor
{
public delegate void AddItemEventHandler(object sender, Selection e);
public event AddItemEventHandler ItemAdded;
protected virtual void OnItemAdded(Selection e)
{
if (ItemAdded != null)
ItemAdded(this, e);
}
public void AddItem(object value)
{
Selection selection = new Selection() { State = value };
OnItemAdded(selection);
}
}
public class Presenter
{
private readonly Command command;
private readonly Interactor interactor;
private readonly Model model;
private readonly View view;
public Presenter(Interactor interactor)
{
this.command = new Command();
this.model = new Model();
this.view = new View();
this.interactor = interactor;
this.interactor.ItemAdded += new Interactor.AddItemEventHandler(interactor_ItemAdded);
}
void interactor_ItemAdded(object sender, Selection e)
{
this.command.DoCommand();
this.model.ModelState = e.State;
this.view.Update ("Processed " + e.State);
}
}
public class View
{
private object ViewState;
static void Main(string[] args)
{
#region Model View Presenter Design Pattern
Interactor interactor = new Interactor();
Presenter presenter = new Presenter(interactor);
interactor.AddItem("Message from the UI");
#endregion
#region 普通观察着模式
Mouse mouse = new Mouse();
Master master = new Master();
Dog dog = new Dog();
Cat cat = new Cat();
cat.Register(mouse);
cat.Register(master);
cat.Register(dog);
cat.Cry();
cat.Notify("猫叫了");
cat.UnRegister(mouse);
cat.UnRegister(master);
cat.UnRegister(dog );
#endregion
#region 基于事件和委托的观察者模式
EventCat eventCat = new EventCat();
EventMouse eventMouse = new EventMouse(eventCat);
EventDog eventDog = new EventDog(eventCat);
EventMaster eventMaster = new EventMaster(eventCat);
eventCat.RaiseObserverMethod();
#endregion
Console.ReadLine();
}
public void Update(object state)
{
ViewState = state;
}
}
}
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 548如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 672组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 529本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5955 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 616前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 839企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 625首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 595概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 999概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 806我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8421 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9711、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 778引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 652oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 606经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 635今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 684我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 672题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
《DesignPattern设计模式》是软件开发领域中的一部经典之作,它主要探讨的是在面向对象编程中如何设计可复用、高效且具有高质量的代码。设计模式是对在软件设计过程中遇到的常见问题的一种最佳实践解决方案的总结,...
标签"DesignPattern设计模式手册"进一步确认了内容主题,而压缩包中的文件名"designpattern(设计模式迷你手册)"则指明了主要的学习资料。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。创建型模式...
6. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 7. **装饰器模式**:装饰器模式允许动态地给一个对象添加一些额外的职责...
在这个"C++ Design Pattern 23种设计模式(全_解释+源代码).zip"压缩包中,包含了对23种经典设计模式的详细解释和源代码实现,这些模式均基于面向对象编程的原则。 首先,我们来看看这些设计模式的基础原则: 1. **...
本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及最新的范式用法,非常适合用于项目重构或作为学习设计模式的参考。 首先,我们来看23种经典的设计模式,它们通常分为三类:创建型、结构型和...
总的来说,《DesignPattern设计模式迷你手册》作为一款工具书,涵盖了软件设计中的核心模式,对于提升开发者的专业素养,优化代码结构,以及增强团队协作都具有极大的价值。无论你是初学者还是经验丰富的开发者,...
设计模式golang版本-go-design-patterns.zip" 包含了将传统设计模式应用到Go语言中的实例和解释。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Go中,我们可以使用接口和...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
在“DesignPattern_BasicKnowledge”中,我们可能会深入学习如何识别和使用这些类关系,以及它们在实际设计模式中的应用,例如工厂模式、单例模式、观察者模式等。通过理解并恰当运用这些关系,开发者可以创建出更加...
"Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...
在本文中,我们将深入探讨设计模式的核心概念,并结合"Head First DesignPattern_src"中的源码,详细解析一些关键的设计模式。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在...
总之,VS2019工程中的"DesignPattern"项目展示了如何在C++中有效利用观察者模式和工厂模式。通过实际的代码实现,我们可以学习到如何在实践中应用这些模式,以及它们如何帮助我们解决设计问题,提高代码质量。如果想...
- 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象...
在这个名为"JAVA design pattern-java设计模式"的CHM文件中,我们可能找到了关于如何在Java开发中应用设计模式的详细信息。 设计模式通常分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建,如单例...
### Design Pattern(设计模式)讲义 #### 一、引言 设计模式是软件工程领域的一个重要主题,它提供了一套解决常见问题的方案。侯捷老师的讲义为我们揭示了设计模式背后的原理与实践方法。这份讲义不仅包含了GoF...
GOF设计模式是设计模式领域的基石,包括创建型模式(如单例、工厂方法、抽象工厂、建造者和原型),结构型模式(如适配器、装饰器、代理、桥接、组合、外观、享元和过滤器)和行为型模式(如策略、模板方法、访问者...
包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式(AbstractFactoryPattern)、观察...
本资料包“JAVA 23种设计模式(全).Design Pattern_Java模式”涵盖了所有23种经典的GOF(GoF,Gang of Four)设计模式,旨在帮助开发者深入理解和应用这些模式。 首先,我们来看一下23种设计模式的分类: 1. **创建...