Observer 观察者模式(行为型模式)

动机(Motivation)

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

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

意图(Intent)

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

示例代码

这是一个ATM取钱的例子:

    public class ATM
{
private BankAccount bankAccount;
     //...
void Process(int data)
{
bankAccount.Widthdraw(data);
}
} public class BankAccount
{
private Emailer emailer;//强依赖关系
private Mobile mobile;//强依赖关系 public void Widthdraw(int data)
{
       //...
UserAccountArgs args=new UserAccountArgs();
//...
emailer.SendEmail(UserAccountArgs.UserEmail);
mobile.SendNotification(UserAccountArgs.MobileNumber);
}
} public class Emailer
{
public void SendEmail(string userEmail)
{
//...
}
} public class Mobile
{
public void SendNotification(string mobileNumber)
{
//...
}
}
public class UserAccountArgs
{
public string UserEmail { get; set; }
public string MobileNumber { get; set; }
}

BankAccount和Emailer、Mobile是紧耦合的关系,需要解耦:

public class BankAccount
{
IList<IAccountObserver> observerList=new List<IAccountObserver>(); public void Widthdraw(int data)
{
//...
UserAccountArgs args=new UserAccountArgs();
//...
foreach (var accountObserver in observerList)
{
accountObserver.Update(args);
}
} public void AddObserver(IAccountObserver accountObserver)
{
observerList.Add(accountObserver);
} public void RemoveObserver(IAccountObserver accountObserver)
{
observerList.Remove(accountObserver);
}
} public interface IAccountObserver
{
void Update(UserAccountArgs args);
} public class Emailer : IAccountObserver
{
//public void SendEmail(string to)
//{
// //...
//} public void Update(UserAccountArgs args)
{
string userEmail = args.UserEmail;
//...
}
} public class Mobile : IAccountObserver
{
//public void SendNotification(string to)
//{
// //...
//} public void Update(UserAccountArgs args)
{
string mobileNumber = args.MobileNumber;
//...
}
} public class UserAccountArgs
{
public string UserEmail { get; set; }
public string MobileNumber { get; set; }
}

如果BankAccount的变化比较多,可以继续抽象来解除与IAccountObserver的耦合:

    public class BankAccount : Subject
{
public void Widthdraw(int data)
{
//...
UserAccountArgs args=new UserAccountArgs();
//...
Notify(args);
}
} public abstract class Subject
{
IList<IAccountObserver> observerList = new List<IAccountObserver>(); public void Notify(UserAccountArgs args)
{
//...
foreach (var accountObserver in observerList)
{
accountObserver.Update(args);
}
} public void AddObserver(IAccountObserver accountObserver)
{
observerList.Add(accountObserver);
} public void RemoveObserver(IAccountObserver accountObserver)
{
observerList.Remove(accountObserver);
}
}

这时BankAccount就和IAccountObserver解除耦合了。

演化过程

当写软件的时候,不一定要套用某个设计模式。为了应对变化,在解耦合的过程中,自然而然就用到了某种模式。

重要的是松耦合的设计思维。学习设计模式的意义在于深化设计思维。

结构(Structure)

Observer模式的几个要点

  • 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否要订阅通知,目标对象对此一无所知。
  • 在C#的event中,委托充当了Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

设计模式18:Observer 观察者模式(行为型模式)的更多相关文章

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

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图( ...

  2. Java经典设计模式之十一种行为型模式

    转载: Java经典设计模式之十一种行为型模式 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式 ...

  3. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

  4. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  5. java架构之路-(设计模式)五种创建型模式之单例模式

    设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...

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

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

  7. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  8. Java设计模式(4)——创建型模式之单例模式(Singleton)

    一.概述 弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计 ...

  9. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

  10. Java设计模式(2)——创建型模式之工厂方法模式(Factory Method)

    一.概述 上一节[简单工厂模式]介绍了通过工厂创建对象以及简单的利弊分析:这一节来看看工厂方法模式对类的创建 工厂方法模式: 工厂方法与简单工厂的不同,主要体现在简单工厂的缺点的改进: 工厂类不再负责 ...

随机推荐

  1. AtomicHashMap

    folly/AtomicHashmap.h folly/AtomicHashmap.h introduces a synchronized UnorderedAssociativeContainer ...

  2. ubuntu 固定静态IP

    http://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html 路由器每重启一次,IP都会改变,那么实验室的路由器一天要断电好几次,那么每 ...

  3. WEB服务重要基础

    1.1用户访问房展基本流程 我们每天都会使用Web客户端上网浏览网页.最常见Web客户端就是Web浏览器,如通过的微软InternetExplorer(IE)以及技术人员偏爱的火狐浏览器.谷歌浏览器等 ...

  4. C#中的数据格式转换 (未完待更新)

    一.string to int int intA = 0;1.intA =int.Parse(str);2.int.TryParse(str, out intA);3.intA = Convert.T ...

  5. Android基础之布局ConstraintLayout

    Google I/O 2016 上发布了 ConstraintLayout,据说很强大,那就一探究竟吧! gradle配置 compile 'com.android.support.constrain ...

  6. 我的Linux之路——windows10用WMware安装CentOS6.9 虚拟机详细步骤

    出自:http://blog.51cto.com/13438667/2059926 一.安装环境 windows10操作系统物理机VMware Workstation 软件(可以在网上下载)CentO ...

  7. python打开浏览器的三种方法

    1.startfile方法 import os os.startfile("C:\Program Files (x86)\Google\Chrome\Application\chrome.e ...

  8. win10 wsl安装 命令行

    用于一些精简版没有商店的安装方法 开启"Windows Subsystem for Linux" 可选特性 打开`PowerShell`,运行下面指令: Enable-Window ...

  9. MySQL数据库篇之数据类型

    主要内容: 一.数值类型 二.日期类型 三.字符串类型 四.枚举类型与集合类型 1️⃣ 数值类型 1.整数类型:tinyint  smallint  mediumint  int  bigint 作用 ...

  10. iPhone与Android手机 各个型号的UserAgent

    摘要:userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值.一般来讲,它是在navigator.appCodeName 的值之后加上斜线和navigator.a ...