观察者模式

定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

1.观察者模式的结构



(1)抽象主题角色(Subject)

把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

(2)抽象观察者角色(Observer)

为所有具体的观察者定义一个抽象类或接口,在得到主题的通知时更新自己。

(3)具体主题角色(ConcreteSubject)

在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

(4)具体观察者角色(ConcreteObserver)

该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

2.代码实现

(1)抽象主题接口————Subject.java

  1. public interface Subject {
  2. void registerobserver(Observer o);
  3. void unregisterobserver(Observer o);
  4. void notifyobservers();
  5. }

(2)抽象观察者接口————Observer.java

  1. public interface Observer {
  2. public void update(String msg);
  3. }

(3)具体主题————Financial.java

  1. import java.util.ArrayList;
  2. /**
  3. * Created by Zephery on 2017/5/7.
  4. */
  5. public class Financial implements Subject {
  6. private ArrayList<Observer> userList = new ArrayList<Observer>();
  7. private String msg;
  8. @Override
  9. public void registerobserver(Observer o) {
  10. if (!userList.contains(o)) {
  11. userList.add(o);
  12. }
  13. }
  14. @Override
  15. public void unregisterobserver(Observer o) {
  16. if (userList.contains(o)) {
  17. userList.remove(o);
  18. }
  19. }
  20. @Override
  21. public void notifyobservers() {
  22. for (Observer observer : userList) {
  23. observer.update(msg);
  24. }
  25. }
  26. public void distributemsg(String s) {
  27. this.msg = s;
  28. notifyobservers();
  29. }
  30. }

(4)具体观察者————user1.java和user2.java

User1

  1. public class User1 implements Observer {
  2. private Subject subject;
  3. public User1(Subject subject){
  4. this.subject=subject;
  5. subject.registerobserver(this);
  6. }
  7. @Override
  8. public void update(String msg){
  9. System.out.println("User1 "+msg+" message");
  10. }
  11. }

User2

  1. public class User2 implements Observer {
  2. private Subject subject;
  3. public User2(Subject subject) {
  4. this.subject = subject;
  5. subject.registerobserver(this);
  6. }
  7. @Override
  8. public void update(String msg) {
  9. System.out.println("User2 " + msg + " message");
  10. }
  11. }

(5)客户端测试类————ObserverPattern.java

  1. public class ObserverPattern {
  2. public static void main(String args[]){
  3. Financial x=new Financial();
  4. User1 y=new User1(x);
  5. User2 z=new User2(x);
  6. x.distributemsg("using");
  7. }
  8. }

结果:

  1. User1 using message
  2. User2 using message

观察者模式——java设计模式的更多相关文章

  1. java设计模式解析(1) Observer观察者模式

      设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...

  2. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  3. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  4. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  5. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  6. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

  7. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

  8. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  9. java设计模式(六)--观察者模式

    转载:设计模式(中文-文字版) 目录: 简单目标任务实现 观察者模式介绍 观察者模式代码实现 观察者模式是JDK中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...

随机推荐

  1. Forward团队-爬虫豆瓣top250项目-设计文档

    组长地址:http://www.cnblogs.com/mazhuangmz/p/7603594.html 成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 设计方案: 1.能分析HTML语言: 2. ...

  2. Monkey and Banana (hdu 1069)

    http://acm.hdu.edu.cn/showproblem.php?pid=1069   题目描述: 给你n个箱子, 给你箱子的长宽高,箱子是可以无限使用的,问这些箱子摞起来最多能多高? 这些 ...

  3. POJ3169--Layout(SPFA+差分系统)

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  4. nodejs mongodb 数据库封装DB类 -转

    使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关于mongoose的安装就是 npm install -g mongoose 这个DB类的数据库配置是 ...

  5. Stein算法求最大公约数

    首先引进一个符号:gcd是greatest common divisor(最大公约数)的缩写,gcd( x,y ) 表示x和y的最大公约数.然后有一个事实需要了解:一个奇数的所有约数都是奇数.这个很容 ...

  6. hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=5091 给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最 ...

  7. poj 3264 区间最大最小值 RMQ问题之Sparse_Table算法

    Balanced Lineup Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , %I64u Java ...

  8. Android-HttpClient-Get请求获取网络图片设置壁纸

    第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4.5.jar/httpclient-4.4.1.jar包放入到libs ...

  9. ABP 框架 数据库底层迁移 Mysql 集群

    技术交流,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 背景 笔者 目前架构的IOT 项目是使用abp 框架作为后台, ...

  10. C#常用修饰符

    访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性,C#有4个访问修饰符:public.private.protected.internal,使用这些访问修饰符可以指定以下5个访问 ...