前言

红灯停,绿灯行,在日常的交通中,每每遇到红灯,司机总是要在路口进行等待,等到绿灯才能通过,这个时候司机就扮演了一个观察者的角色,随着灯的颜色的变化,司机的行为也跟着变化,在软件系统中,有些对象之间也存在类似交通信号灯和汽车之间的关系,一个对象的的行为状态改变导致了其他对象的状态或行为也发生变化,他们之间将进行联动,正所谓"触一而牵百发",为了更好的描述对象之间存在着这种一对多的联动,观察者模式就应运而生了。它定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象

什么是观察者模式呢? Observer Pattern

定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关的依赖对象皆得到通知并自动更新,观察者模式的别名包括发布-订阅(Publish/Subscribe)模式,模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或者从属者(Dependents)模式。观察者模式是一种对象行为型模式

观察者模式的优点

(1)、观察者模式可以实现表示层和数据逻辑层分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色

(2)、观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密的耦合在一起,因此他们可以属于不同的抽象化层次

(3)、观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度

(4)、观察者模式满足开闭原则的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便

观察者模式的缺点

(1)、如果一个观察对象目标有很多直接和简介观察者,将所有的观察者都通知到会花费很多时间。

(2)、如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃

(3)、观察者模式没有相应的机制让观察者知道所观察的目标是怎么变化的,而仅仅只是知道观察目标发生了变化

观察者模式的适用场景

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

(2)、一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁

(3)、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象。。。。,可以使用观察者模式创建一种链式触发机制。

观察者模式的具体实现

目录结构

抽象观察者

package com.company;//抽象观察者
public interface Observer {String getName();void setName(String name);void help();  //声明支援盟友方法void beAttacked(AllyControllCenter aco);   //声明遭受攻击的方法
}

具体观察者

package com.company;//战队成员类:具体观察者
public class Player implements Observer {private String name;public Player(String name) {this.name = name;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name=name;}@Override//支援盟友的方法public void help() {System.out.println("坚持住,"+this.name+"来救你");}@Override//遭受攻击方法的实现,当遭受攻击时将调用战队控制中心类的通知方法notifyObserver()//通知盟友public void beAttacked(AllyControllCenter aco) {System.out.println(this.name+"被攻击!");aco.notifyObserver(name);}
}

控制类

package com.company;import java.util.ArrayList;//战队控制中心类:目标类
public abstract class AllyControllCenter {protected String allyName;   //战队名称protected ArrayList<Observer> players=new ArrayList<Observer>();  //定义一个集合存储战队成员//注册方法public void join(Observer abs){players.add(abs);System.out.println(abs.getName()+"加入"+this.allyName+"战队!");}//声明抽象通知方法public abstract void notifyObserver(String name);//注销方法public void quit(Observer abs){System.out.println(abs.getName()+"退出"+this.allyName+"战队!");players.remove(abs);}public String getAllyName() {return allyName;}public void setAllyName(String allyName) {this.allyName = allyName;}public ArrayList<Observer> getPlayers() {return players;}public void setPlayers(ArrayList<Observer> players) {this.players = players;}
}

具体目标类

package com.company;//具体战队控制中心类:具体目标类
public class ConcreteAllyControllCenter extends  AllyControllCenter{public ConcreteAllyControllCenter(String allyName){System.out.println(allyName+"战队组建成功!");System.out.println("--------------");this.allyName=allyName;}@Override//实现通知方法public void notifyObserver(String name) {System.out.println(this.allyName+"战队紧急通知,盟友"+name+"遭受敌人攻击!");//遍历观察者集合,调用每一个盟友(自己除外)的支援方法for(Object abs:players){if(!((Observer)abs).getName().equalsIgnoreCase(name)){((Observer) abs).help();}}}
}

测试类

package com.company;public class Main {public static void main(String[] args) {//定义观察目标对象AllyControllCenter acc;acc=new ConcreteAllyControllCenter("金庸群侠");//定义四个观察者对象Observer player1,player2,player3,player4;player1=new Player("杨过");acc.join(player1);player2=new Player("令狐冲");acc.join(player2);player3=new Player("张无忌");acc.join(player3);player4=new Player("段誉");acc.join(player4);//某成员遭受攻击player1.beAttacked(acc);}
}

转载请注明出处,掌声送给社会

设计模式的艺术 行为型模式之观察者模式相关推荐

  1. 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现

    课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二. ...

  2. 设计模式的艺术 创建型模式之原型模式

    不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学. 前言 西游记中孙悟空拔毛出分身的故事大家都知道,孙悟空根据了自己的形象创建了分身,克隆出了一个和自己几乎一模一样的身外身,设计模式 ...

  3. 设计模式的艺术 行为型模式之迭代器模式

    前言 现在的电视机都配置了一个遥控器,用户可以通过遥控器去选择上一个或者下一个台,我们只需要知道如何使用这个遥控器,而无须关注电视是怎么把电视频道放入其中的,在软件实际的开发中,也有这么一种类,它储存 ...

  4. 设计模式的艺术 行为型模式之备忘录模式

    前言 每个人都会有后悔的时候,可是人生没有后悔药,做过的事情无法再去后悔,软件设计中却是有这么一种后悔机制,叫做备忘录模式,它就是软件中的"后悔药" 什么是备忘录模式  Memen ...

  5. 设计模式-行为型模式-Observer 观察者模式

    设计模式-行为型模式-Observer 观察者模式 1.简介 软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的: 观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对 ...

  6. iOS设计模式四部曲(三):行为型模式 内附Demo

    本篇是四部曲的第三篇,第一篇请点这里iOS设计模式四部曲(一):创建型模式,第二篇请点击这里iOS设计模式四部曲(二):结构型模式.由于个人能力有限,文中难免有一些遗漏或者错误,请各位看官不吝赐教!谢 ...

  7. 行为型模式:观察者模式

    前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. 行为型模式:观察者模式 十一大行为型模式之七:观察者模式. 简介 姓名 :观察者模式 英文名 :Observer ...

  8. 行为型模式之观察者模式

    学习设计模式,让你提升百倍 专栏 重点文章 设计模式 设计模式基础前奏(上) 设计模式 设计模式基础前奏(下) 设计模式 创建者模式之单例模式 设计模式 创建者模式之工厂模式 设计模式 创建者模式之原 ...

  9. Java设计模式之五大创建型模式

    Java设计模式之五大创建型模式 设计模式(23种) 单例模式(Singleton Pattern) 参考链接 概念 使用场景 实现思路 实现方式 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线 ...

  10. 【设计模式·Python】创建型模式

    设计模式中,创建型模式主要由以下几种: 工厂方法模式 抽象工厂模式 建造者模式 原型模式 单例模式 简单工厂模式 不直接向客户暴露对象的实现细节,而是通过一个工厂类来负责创建产品的实例. 角色: 工厂 ...

最新文章

  1. Intel Developer Forum 2010英特尔信息技术峰会第二天小记
  2. python算术运算_Python 的二元算术运算详解
  3. python输出第几行第几个_python怎么PRINT出第几行
  4. 用同一uuid作为两个字段的值_分库设计中的主键选择
  5. 我们离DevOps有多远--持续集成思想的延伸
  6. .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(下)...
  7. vue如何split_vue代码分割的实现(codesplit)
  8. 关于时间复杂度(持续更新.....)
  9. 视频:PNAS报道纤维化扩展中“旁张力信号”介导的细胞间机械通讯
  10. 无效的wechatwin.dll文件errcode:126,点击“确定”下载最新版本
  11. [转载] python---python中时间的应用(time模块)
  12. 悲剧啊,疑似食物中毒和空气污染
  13. win7显示文件的扩展名
  14. html 中各种鼠标手势
  15. [SIGMOD 2021] SharPer: Sharding Permissioned Blockchains Over Network Clusters
  16. 记录Widows10系统崩溃后安装Widows7系统的心酸历程
  17. 【ELM预测】基于极限学习机ELM实现数据预测matlab源码
  18. 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
  19. Linux 快速上手(基于Java开发)
  20. bootloader的功能介绍

热门文章

  1. Linux tcp拥塞控制
  2. 解决IDEA打断点后,执行代码不会停在断点问题
  3. 使用百度API获取位置信息
  4. 信息系统规划方法-战略目标集转化法(SST)
  5. jle汇编_x86汇编指令集大全(带注释)
  6. php faker,PHP Faker 教程
  7. Three.js - 光源使用详解3(环境光 HemisphereLight、镜头光晕 LensFlare)
  8. 类和结构体的内存空间占有问题
  9. 2022年最新用最简单粗暴的方式讲解:pytest简介,框架基础应用,运行方式,失败用例重跑。直击核心
  10. 利用CA证书配置安全Web站点