1. Java之观察者模式(Observer Pattern

(1)概述:

 生活中我们在使用新闻app,当我们对某一栏比较感兴趣,我们往往会订阅这栏新闻,比如我对军事栏感兴趣,我就会订阅军事栏的新闻。这样的话,一旦有了军事栏新闻更新,App就会自动弹出通知告知我们。

这就是观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象(被观察者)的状态发生改变时, 所有依赖于它的对象(观察者)都得到通知并被自动更新。

(2)观察者模式的UML类图:

角色介绍:

1)Subject:抽象主题,也就是被观察者(Observable)角色,抽象主题角色把所有观察者对象的引用保存在一个集合之中,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

2)ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生变化时候,给所有注册过的观察者发出通知,具体主题角色又叫具体被观察者(Concrete Observable)角色。

3)Observer:抽象观察者,该角色是观察者的抽象类,它定义了一个更新的接口,使得在得到主题的更改通知时候更新自己。

4)ConcreteObserver:具体的观察者,该角色实现抽象观察者角色定义的更新接口,以便在主题的状态发生变化的时候更新自身的状态。

2. 观察者模式代码实现:

(1)下面是一个猎头的典型例子。这个图中有2个角色-猎头和求职者。求职者先在猎头处注册,当有新的工作机会时猎头就会通知求职者。

观察者模式—猎头和求职者的UML图,如下:

(2)新建Java工程,如下:

Subject(接口):抽象主题,被观察者角色

 package com.himi.observable;

 import com.himi.observer.Observer;

 public interface Subject {
public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyAllObservers();
}

HeadHunter:具体主题,具体被观察者者角色。

 package com.himi.observable;

 import java.util.ArrayList;

 import com.himi.observer.Observer;

 public class HeadHunter implements Subject {

     //define a list of users, such as Mike, Bill, etc.
private ArrayList<Observer> userList;
private ArrayList<String> jobs; public HeadHunter(){
userList = new ArrayList<Observer>();
jobs = new ArrayList<String>();
} @Override
public void registerObserver(Observer o) {
userList.add(o);
} @Override
public void removeObserver(Observer o) {} @Override
public void notifyAllObservers() {
for(Observer o: userList){
o.update(this);
}
} public void addJob(String job) {
this.jobs.add(job);
notifyAllObservers();
} public ArrayList<String> getJobs() {
return jobs;
} public String toString(){
return jobs.toString();
} }

Observer(接口):抽象观察者,观察者的抽象类。

 package com.himi.observer;

 import com.himi.observable.Subject;

 public interface Observer {
public void update(Subject s);
}

JobSeeker:具体的观察者。

 package com.himi.observer;

 import com.himi.observable.Subject;

 public class JobSeeker implements Observer {

     private String name;

     public JobSeeker(String name){
this.name = name;
}
@Override
public void update(Subject s) {
System.out.println(this.name + " got notified!");
//print job list
System.out.println(s);
} }

最后我们测试一下观察者模式代码如下:

 package com.himi.test;

 import com.himi.observable.HeadHunter;
import com.himi.observer.JobSeeker; public class Test { public static void main(String[] args) {
HeadHunter hh = new HeadHunter();
hh.registerObserver(new JobSeeker("Mike"));
hh.registerObserver(new JobSeeker("Chris"));
hh.registerObserver(new JobSeeker("Jeff")); //每次添加一个个job,所有找工作人都可以得到通知。
hh.addJob("Baidu Job");
hh.addJob("Alibaba Job");
hh.addJob("Tecent Job");
} }

运行程序如下:

Java设计模式16:常用设计模式之观察者模式(行为型模式)的更多相关文章

  1. Java设计模式 --- 七大常用设计模式示例归纳

    设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 行为型模式:模 ...

  2. (转)Java经典设计模式(1):五大创建型模式(附实例和详解)

    原文出处: 小宝鸽 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代 ...

  3. PHP常用设计模式,PHP常用设计模式详解,PHP详解设计模式,PHP设计模式

    PHP常用设计模式详解 单例模式: php交流群:159789818 特性:单例类只能有一个实例 类内__construct构造函数私有化,防止new实例 类内__clone私有化,防止复制对象 设置 ...

  4. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  5. 设计模式学习之单例模式(Singleton,创建型模式)(4)

    假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...

  6. java几种常用设计模式简单示例

    1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生.具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有 ...

  7. JAVA OOP 编程-常用设计模式

    smart-design-pattern 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看 ...

  8. .NET设计模式(19):观察者模式(Observer Pattern)(转)

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

  9. NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)

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

  10. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

随机推荐

  1. cef3加载flash闪烁问题非easyhook的另外一种解决方法

    1.现象 cef3加载flash,会出现弹出命令行窗口,显示not sandboxed,影响使用体验. 网上的解决方法,参考此文. http://blog.csdn.NET/zx2356/articl ...

  2. 用bind方法保持this上下文

    什么是this对象 先来说说什么是this对象吧.每一个函数在调用的时候都会自己主动获取两个特殊变量:this和arguments对象. this值详细是指哪个对象是和该函数的运行环境相关的.假设是作 ...

  3. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  4. mac下安装MySQL【转】

    转:http://www.jb51.net/article/103841.htm 1.官网下载 MySQL v5.7官方正式版下载地址:http://www.jb51.net/softs/451120 ...

  5. 【转】JUC下面线程池介绍

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  6. 比较ArrayList和LinkedList的异同

    1.ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构: 2.对于随机访问get和set,ArrayList要优于LinkedList; 3.对于添加和删除操 ...

  7. nginx 错误日志分析

    502 1.查看nginx错误日志 tailf /data/log/nginx/error.log // :: [error] #: * recv() failed (: Connection res ...

  8. Docker 更改镜像存储位置

    在使用 Docker 的过程中,如果我们一切都以默认的设置进行操作的话,在使用一段时间之后你应该会发现系统的根目录空间越来越少,直到有一天发现空间都被占满了,最后发现原来是被 Docker 占用了.所 ...

  9. druapl7:"Notice: A non well formed numeric value encountered 在 _hierarchical_select_hierarchy_generate() "

    这个是很诡异的一个Notice错误提醒,因为我在Drupal7.54+PHP7.0.1的环境下,并没有报这个错.但是我再Drupal7.59+PHP7.1.7的环境下就报错了.很奇怪,按照报错信息bi ...

  10. Spring Boot—17MongoDB

    在MongoDB中插入如下的数据 db.baike.insert( { _id: 'freemark', desc: '新一代模板语言', tag: [ 'IT', '模板语言' ], comment ...