18. Observer 观察者模式                     2008-09-15

动机(Motivation)

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。

使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。

意图(Intent

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。        ——《设计模式》GoF

 

示意代码:

    //Subject类,它把所有对观察者对象的引用保存在一个聚焦里,每个主题都可以
    //有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
    abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();

        //增加观察者
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        //移除观察者
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
                o.Update();
        }
    }
    //ConcereteSubject类,具体主题,将有关状态存入具体观察者对象:
    //在具体主题的内部状态改变时,给所有登记过的观察者发出通知
    class ConcreteSubject : Subject
    {
        private string subjectState;

        //具体通知者状态
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }
    //Observer类,抽象观察者,为所有的具体观察定义一个接口,在得到主题的通知时更新自己
    abstract class Observer
    {
        public abstract void Update();
    }
    //ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,
    //以便使本身的状态与主题的状态相协调
    class ConcreteObserver : Observer
    {
        private string name;
        private string observerState;
        private ConcreteSubject subject;

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this.subject = subject;
            this.name = name;
        }

        //更新
        public override void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("观察者{0}的新状态是{1}",
              name, observerState);
        }

        public ConcreteSubject Subject
        {
            get { return subject; }
            set { subject = value; }
        }
    }

客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            ConcreteSubject s = new ConcreteSubject();

            s.Attach(new ConcreteObserver(s, "X"));
            s.Attach(new ConcreteObserver(s, "Y")); 
            s.Attach(new ConcreteObserver(s, "Z"));

            s.SubjectState = "ABC";
            s.Notify();

            Console.Read();
        }
    }

Observer 的几个要点

使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。

目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。

在C#的event中,委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。

适用性

1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

转载于:https://www.cnblogs.com/MaoBisheng/archive/2008/09/15/1291130.html

设计模式笔记 18. Observer 观察者模式(行为型模式)相关推荐

  1. 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...

  2. 23种设计模式介绍(一)---- 创建型模式

    由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...

  3. 【设计模式】(八)--创建型模式--建造者模式

    [设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...

  4. 【设计模式】三大类:创建型模式、结构型模式、行为型模式

    1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...

  5. python与网页设计的区别_Python与设计模式(三):行为型模式(上)

    接前文:kant li:Python与设计模式(二):结构型模式(下)​zhuanlan.zhihu.com 行为型模式主要处理对象间的通信问题,包括责任链模式.命令模式.解释器模式.迭代器模式.观察 ...

  6. 设计模式其实很简单之行为型模式

    关注公众号获取更多资料 设计模式- 行为型模式 ​ 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. ​ 行为型模式是23中设计模式 ...

  7. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  8. 设计模式混编:观察者模式+中介者模式

    针对变化万千的业务需求,采用合适的设计模式是可以轻松应对的. 本文将探索多种优秀设计模式的混编来解决复杂场景的问题,实现1+1>2的效果.应用实践离不开基础,所以文章将以基本概念.设计初衷出发, ...

  9. C#面向对象设计模式纵横谈——Singleton单件(创建型模式)

    Singleton单件(创建型模式) 动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的 ...

最新文章

  1. SAP MM 项目上线库存初始化导入问题 --- 进口物料在途库存之处理
  2. Java学习3之成员方法及函数重载
  3. flutter apk 打包
  4. 51Nod - 1024 矩阵中不重复的元素(数学)
  5. Jenkins配置Findbugs做源代码安全扫描
  6. 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言
  7. Netty工作笔记0005---NIO介绍说明
  8. aida32系统信息报告
  9. 使用 rem 布局的优缺点?
  10. 赚自己的淘宝佣金,让返利网无路可走
  11. 自强不息系列之Java 实例 - 线程优先级设置
  12. 区块链游戏企鹅大陆上线10000创始限时开放注册
  13. 【python】蓄水池
  14. Python基础 函数
  15. 淘淘商城分布式电商系统项目总结
  16. 「牛客网C」初学者入门训练BC139,BC158
  17. 新手小白如何开始网络赚钱?最靠谱的实操方法来了!
  18. 父母不要对孩子说的10句话
  19. 数模常用查找数据网址大全
  20. NJU数电实验1-3

热门文章

  1. springboot在intellij中的热部署(Hot swapping)配置
  2. Django的电子商务网站的调研
  3. windows7 64位下安装tensorflow终极解决方案
  4. ext不能选中复制属性_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
  5. 商品表有哪些字段_面试中有哪些经典的数据库问题?
  6. php 超链接新页面打开新页面,Typecho 超链接默认新窗口打开
  7. oracle的脚本语言,Oracle 无法执行SQL脚本语句
  8. mysql中的extract()函数
  9. find命令---Linux学习笔记
  10. Android中Intent传递Object和ArrayListObject对象---笔记