`
liss
  • 浏览: 844242 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

观察者模式(Observer Pattern)

阅读更多

(1)应用:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己
(2)角色:
    * 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。
    * 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。
    * 具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。具体主题角色通常用一个具体子类实现。
    * 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
(.NET中提供了Delegate与Event机制,我们可以利用这种机制简化Observer模式。)
(3)故事:
此时,玉皇大帝和一群神仙已来到南天门观战,只见二郎神率领梅山六兄弟围着孙悟空好一阵穷追猛打。
太上老君说:“让我来助二郎神一功。”说着捋起衣袖,从左胳膊上取下一只“金钢套”,
照准猴王的脑袋扔了下去。猴王苦战之中,来不及躲闪,被“金钢套”打中了天灵,跌了一跤。
正待爬将起来就跑,被二郎神豢养的哮天犬赶上来,一口咬住了腿肚子。
二郎神和梅山六兄弟一拥而上,终于捉住了这个不可一世的妖猴。
(4)分析:
观察者模式定义了一种一(猴子)对多(观战团成员)的依赖关系,让多个观察者对象(观战团成员)同时监听某一个主题对象(猴子)。这个主题对象(猴子)在状态上发生变化时,会通知所有观察者对象(观战团成员工),使它们能够自动更新自己
(5)实现
using System;
using System.Collections.Generic;

public delegate void 委托通知观察者(状态持有者 观察对象);
public class 状态持有者
{
    /// <summary>
    /// 私有状态
    /// </summary>
    private string _状态;
    /// <summary>
    /// 只读
    /// </summary>
    public string 状态 { get { return _状态; } }
    public 状态持有者()
    {
        _状态 = "正在战斗";
    }
    /// <summary>
    /// 战斗过程
    /// </summary>
    public void 战斗过程开始()
    {
        //通知观战团猴子的被始状态
        设置状态(_状态);
        //变更状态,也会引发通知
        Console.WriteLine("二郎神率领梅山六兄弟围着孙悟空好一阵穷追猛打");
        设置状态("被穷追猛打");
    }
    //为了示例,让你们直接修改我的状态好了
    //其实你扔金钢套,不一定能打中我
    //另外我也不怕狗
    public void 设置状态(string 状态)
    {
        _状态 = 状态;
        if (通知观察者 != null)
        {
            Console.WriteLine("现在还有{0}个观察者在偷偷看我" , 通知观察者.GetInvocationList().Length);
            通知观察者(this);
        }
    }
    public event 委托通知观察者 通知观察者;
}


/// <summary>
/// 抽象观察者,除了玉帝,其它人不允许你干看着
///对了玉帝也不行,你不出力也要喊两嗓子,以示你是一个观察者
/// </summary>
public interface 观察者
{
    void 行动(状态持有者 观察对象);
}

/// <summary>
/// 对不起,我只会说不会做
/// </summary>
public class 玉帝 : 观察者
{
    public void 行动(状态持有者 观察对象)
    {
        Console.WriteLine("玉帝:我看到猴子" + 观察对象.状态);
    }
}
public class 太上老君 : 观察者
{
    public void 行动(状态持有者 观察对象)
    {
        if (观察对象.状态 == "正在战斗")
        {
            Console.WriteLine("太上老君:我在等待时机");
        }
        //该出手时就出手呀
        else if (观察对象.状态 == "被穷追猛打")
        {
            Console.WriteLine("太上老君:我扔下金钢套,打中了猴子");
            观察对象.通知观察者 -= new 委托通知观察者(行动);
            Console.WriteLine("太上老君:任务完成,退出观察者行列");
            观察对象.设置状态("跌了一跤");
           
        }

    }
}
/// <summary>
/// 其中的一名观察者,为了等猴子跌一跤
/// </summary>
public class 哮天犬 : 观察者
{
    public void 行动(状态持有者 观察对象)
    {
        if (观察对象.状态 == "跌了一跤")
        {
            Console.WriteLine("哮天犬赶上来,一口咬住了腿肚子");
            观察对象.通知观察者 -= new 委托通知观察者(行动);
            观察对象.设置状态("咬住了腿肚子");
        }
    }
}

/// <summary>
///作用与哮天犬同
///为了讲完这个故事
/// </summary>
public class 二郎神和梅山六兄弟 : 观察者
{
    public void 行动(状态持有者 观察对象)
    {
        if (观察对象.状态 == "咬住了腿肚子")
        {
            Console.WriteLine("二郎神和梅山六兄弟一拥而上,终于捉住了这个不可一世的妖猴");
            观察对象.通知观察者 -= new 委托通知观察者(行动);
            观察对象.设置状态("被捉住了");
        }
    }
}

public class MyClass
{
    public static void Main()
    {
        //天庭观战团有四名成员
        观察者[] 天庭观战团 = new 观察者[]{
            new 玉帝(),
            new 太上老君(),
            new 哮天犬(),
            new 二郎神和梅山六兄弟()
            };
        //实例化状态持有者,这儿就是孙悟空
        状态持有者 孙悟空 = new 状态持有者();
        //孙悟空要知会所有对自己状态感兴趣的成员
        //有点笨,你不通知它们不就好了
        foreach (观察者 实例化的观察者 in 天庭观战团)
        {
            孙悟空.通知观察者 += new 委托通知观察者(实例化的观察者.行动);
        }
        //开始打斗
        孙悟空.战斗过程开始();
       
        Console.Read();
    }
}
(6)结果
现在还有4个观察者在偷偷看我
玉帝:我看到猴子正在战斗
太上老君:我在等待时机
二郎神率领梅山六兄弟围着孙悟空好一阵穷追猛打
现在还有4个观察者在偷偷看我
玉帝:我看到猴子被穷追猛打
太上老君:我扔下金钢套,打中了猴子
太上老君:任务完成,退出观察者行列
现在还有3个观察者在偷偷看我
玉帝:我看到猴子跌了一跤
哮天犬赶上来,一口咬住了腿肚子
现在还有2个观察者在偷偷看我
玉帝:我看到猴子咬住了腿肚子
二郎神和梅山六兄弟一拥而上,终于捉住了这个不可一世的妖猴
现在还有1个观察者在偷偷看我
玉帝:我看到猴子被捉住了

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2006/10/07/1324137.aspx

分享到:
评论

相关推荐

    swift-Swiftµframework实现观察者模式Observerpattern

    Swift µframework 实现观察者模式Observer pattern

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

    "ObserverPattern(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    观察者模式observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动编程或者...

    ObserverPattern

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,属于对象交互模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于...

    观察者模式,Observer

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    observer-pattern-demo 观察者模式示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....

    观察者模式(Observer)原理图

    观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...

    java 观察者模式 demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...

    观察者(Observer)模式详解

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    观察者模式源码

    观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式主要通过...

    简单理解观察者模式(Observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...

Global site tag (gtag.js) - Google Analytics