一.类图

二.意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

三.适用性

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

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

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

四.实例

乡村爱情第五部中大脑袋为大拿出了一个主意,当杨总来的时候保安拦住杨总,同时通知王大拿。这细节就不细说了,如果想看的上网看就行了。这是一个典型的Observer设计模式。

package explore.observer;

public interface Observer {public void notice();}

package explore.observer;//Observer对象public class GuardLeader implements Observer {    @Overridepublic void notice() {        System.out.println("王总,杨总来了!");    }}

package explore.observer;//Observer对象public class GuardMember implements Observer {    @Overridepublic void notice() {        System.out.println("杨总来了...唠了十分钟...");    }}

package explore.observer;

public interface Observable {public void addObserver(Observer o);public void delObserver(Observer o);public void inform();}

package explore.observer;

import java.util.ArrayList;import java.util.List;

//observable对象public class Gate implements Observable {public List<Observer> guards = null;

public Gate() {        guards = new ArrayList<Observer>();    }

public void openTheGate(String person) {if("杨总".equals(person)) {            inform();        }        System.out.println("欢迎杨总!");    }

    @Overridepublic void addObserver(Observer o) {        guards.add(o);    }

    @Overridepublic void delObserver(Observer o) {        guards.remove(o);    }

    @Overridepublic void inform() {for(Observer o : guards) {            o.notice();        }

    }}

package explore.observer;

public class Client {public static void main(String[] args) {        GuardLeader leader = new GuardLeader();        GuardMember member = new GuardMember();        Gate gate = new Gate();        gate.addObserver(leader);        gate.addObserver(member);        gate.openTheGate("杨总");    }}

这个Observer模式是自定义的代码实现的,同时JDK中给出了Observer的实现接口分别是Observable和Observer。这两个类的用法俺就不说了,大家试着读一下API吧。

五.Awt中Observer模式

Java awt包中用Observer模式最多了,写过照面程序的都知道:我们对程序的每个操作都要有Observer类监听,否则不会产生我们想要的结果。

看一下Button类的源码:

public class Button extends Component implements Accessible {... ...public synchronized void addActionListener(ActionListener l) {if (l == null) {return;        }        actionListener = AWTEventMulticaster.add(actionListener, l);        newEventsOnly = true;    }

public synchronized void removeActionListener(ActionListener l) {if (l == null) {return;        }        actionListener = AWTEventMulticaster.remove(actionListener, l);        }

protected void processActionEvent(ActionEvent e) {        ActionListener listener = actionListener;if (listener != null) {            listener.actionPerformed(e);        }        }

转载于:https://www.cnblogs.com/focusj/archive/2012/03/19/2406365.html

设计模式系列--Observer相关推荐

  1. Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

    前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...

  2. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  3. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  4. javascript设计模式系列 - LukeLin - 博客园

    javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式(Pr ...

  5. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  6. PHP - 设计模式系列

    1.应用场景 主要用于学习掌握编程中的设计模式,开发高质量, 易扩展,维护的程序. 学习掌握编程最佳实践.有时候也是为了应对面试,但不应该是作为有追求的编程者的主要目的. 2.学习/操作 1.文档阅读 ...

  7. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  8. 大家一起学面向对象设计模式系列Chapter 02 软件设计的基本原则

    我们为什么要使用设计模式呢?有人可能会说为了设计出"高内聚低耦合"的软件."高内聚低耦合"的软件实际上也就是本文所说的具有可维护性和可复用性的软件. 这篇文章主 ...

  9. .NET设计模式系列文章

    .NET设计模式系列文章 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写 ...

最新文章

  1. 真香!Vision Transformer 快速实现 Mnist 识别
  2. linux查找文件命令 要查找包含某字符
  3. emc文件存储服务器,emc存储怎么挂在linux服务器上
  4. 新垣结衣自拍照_如何阻止自拍照出现在iPhone的自拍照专辑中
  5. react ant design路由配置
  6. 最近在我的python博客上花时间!
  7. httpposterror_java – HttpClientError:目标服务器无法响应
  8. 已知一个点的经纬度、方位角、距离,求另一点经纬度
  9. 少走弯路的十条忠告收藏
  10. vue实现微信分享链接 生成卡片
  11. JavaScript中 切割截取字符串的几种方法
  12. 真正拖垮你的,其实是沉没成本
  13. css3d动画库,CSS3动画库animate.css 50多种动画形式
  14. 图扑智慧城市 | 搭建政务民生可视化管理系统
  15. 计算机wonder基础知识,WonderSkills教材来了!一套更适合中国孩子的美国语文教材...
  16. 编码器-解码器(seq2seq)
  17. 培养气质的99个好习惯
  18. Matlab实现电子钢琴
  19. 浏览器下载文件时,总是中断然后重头开始重复下载的解决办法
  20. 恶补tranformer(一)--cv,在看代码,后期补

热门文章

  1. 整理30份酷炫可视化大屏模板,一个代码不用敲,半天学不会来找我
  2. Flex 开发android程序键盘遮挡输入框解决方案
  3. 案例学习BlazeDS+Spring之十:Chat(
  4. php主动推送弹幕_源起网-织梦发布文档主动百度推送熊掌推送批量推送
  5. Activity启动模式和FLAG、TASKAFFINITY
  6. windows加密和linux加密_Windows系统自带的BitLocker加密方法
  7. 单因素方差分析graphpad_【SPSS】单因素方差分析(比较均值gt;单因素ANOVA)
  8. python代码覆盖率测试_Python代码覆盖率分析工具----Coverage
  9. css3实现翻转效果,css3 实现3D翻转效果
  10. heap python_python topN max heap,使用heapq还是自实现?