`

Design Pattern 设计模式【观察者】

阅读更多

  观察者设计模式中存在两种角色: 观察者和被观察者。

  最经典的例子就是“猫叫了,老鼠跑了,惊醒了主人。”,这个例子也是我以前去微软面试的时候碰到的一个面试题,当时就是让我设计一下这个过程的实现框架。

  在这个例子中,老鼠和主人其实就是观察者,而猫属于被观察者,老鼠和主人观察猫的变化,猫有了动作,老鼠和主人就要做出响应。被观察者,就是这个过程,也可以叫做整个事件的根本原因,亦可以叫直接导火索。 

  从上面这个例子不难看出,观察者和被观察者的关系通常是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
    }
  
}

 

  第二种是在.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));
        }
    }
}

 

 

  下面是他们的调用代码,是一个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 { getset; }
    }
    
public class Command
    {
        
public void DoCommand()
        { }
    }
    
public class Selection : EventArgs
    {
        
public object State { getset; }
    }
    
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;
        }
    }
}

 

 

分享到:
评论

相关推荐

    DesignPattern设计模式

    《DesignPattern设计模式》是软件开发领域中的一部经典之作,它主要探讨的是在面向对象编程中如何设计可复用、高效且具有高质量的代码。设计模式是对在软件设计过程中遇到的常见问题的一种最佳实践解决方案的总结,...

    DesignPattern设计模式迷你手册CHM

    标签"DesignPattern设计模式手册"进一步确认了内容主题,而压缩包中的文件名"designpattern(设计模式迷你手册)"则指明了主要的学习资料。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。创建型模式...

    design pattern 设计模式 清晰中文版

    6. **观察者模式**:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 7. **装饰器模式**:装饰器模式允许动态地给一个对象添加一些额外的职责...

    C++ Design Pattern 23种设计模式(全_解释+源代码).zip

    在这个"C++ Design Pattern 23种设计模式(全_解释+源代码).zip"压缩包中,包含了对23种经典设计模式的详细解释和源代码实现,这些模式均基于面向对象编程的原则。 首先,我们来看看这些设计模式的基础原则: 1. **...

    design pattern设计模式范例

    本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及最新的范式用法,非常适合用于项目重构或作为学习设计模式的参考。 首先,我们来看23种经典的设计模式,它们通常分为三类:创建型、结构型和...

    DesignPattern设计模式迷你手册(CHM)

    总的来说,《DesignPattern设计模式迷你手册》作为一款工具书,涵盖了软件设计中的核心模式,对于提升开发者的专业素养,优化代码结构,以及增强团队协作都具有极大的价值。无论你是初学者还是经验丰富的开发者,...

    golang design pattern; 设计模式golang版本-go-design-patterns.zip

    设计模式golang版本-go-design-patterns.zip" 包含了将传统设计模式应用到Go语言中的实例和解释。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Go中,我们可以使用接口和...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    DesignPattern_BasicKnowledge设计模式之类关系

    在“DesignPattern_BasicKnowledge”中,我们可能会深入学习如何识别和使用这些类关系,以及它们在实际设计模式中的应用,例如工厂模式、单例模式、观察者模式等。通过理解并恰当运用这些关系,开发者可以创建出更加...

    Design*Pattern*Framework*4.5

    "Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...

    设计模式源码Head_First_DesignPattern_src

    在本文中,我们将深入探讨设计模式的核心概念,并结合"Head First DesignPattern_src"中的源码,详细解析一些关键的设计模式。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在...

    DesignPattern(VS2019_观察者模式_工厂模式).zip

    总之,VS2019工程中的"DesignPattern"项目展示了如何在C++中有效利用观察者模式和工厂模式。通过实际的代码实现,我们可以学习到如何在实践中应用这些模式,以及它们如何帮助我们解决设计问题,提高代码质量。如果想...

    designPattern设计模式完结

    - 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象...

    JAVA design pattern-java设计模式

    在这个名为"JAVA design pattern-java设计模式"的CHM文件中,我们可能找到了关于如何在Java开发中应用设计模式的详细信息。 设计模式通常分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建,如单例...

    Design Pattern(设计模式)讲义

    ### Design Pattern(设计模式)讲义 #### 一、引言 设计模式是软件工程领域的一个重要主题,它提供了一套解决常见问题的方案。侯捷老师的讲义为我们揭示了设计模式背后的原理与实践方法。这份讲义不仅包含了GoF...

    设计模式 相关资料 design pattern

    GOF设计模式是设计模式领域的基石,包括创建型模式(如单例、工厂方法、抽象工厂、建造者和原型),结构型模式(如适配器、装饰器、代理、桥接、组合、外观、享元和过滤器)和行为型模式(如策略、模板方法、访问者...

    design pattern

    包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式(AbstractFactoryPattern)、观察...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    本资料包“JAVA 23种设计模式(全).Design Pattern_Java模式”涵盖了所有23种经典的GOF(GoF,Gang of Four)设计模式,旨在帮助开发者深入理解和应用这些模式。 首先,我们来看一下23种设计模式的分类: 1. **创建...

Global site tag (gtag.js) - Google Analytics