观察者模式
交通信号灯是汽车的观察目标,汽车是观察者
一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化
为了描述这种一对多或一对一的联动,观察者模式应运而生
在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。
别名
发布与订阅模式
模型与视图模式
源监听模式
从属者模式
角色
Subject目标、主题、被观察对象
定义观察者集合
提供方法增加和删除观察者对象
定义通知方法notify
可以是接口、抽象类或具体类
ConcreteSubject具体目标
包含经常发生改变的数据
状态改变向观察者发出通知
Observer观察者
对观察目标的改变做出反应
声明更新数据的方法update
ConcreteObserver具体观察者
存储具体观察者的状态
实现update方法
调用目标类的attach方法,加入集合
或通过detach方法将自己从目标类的集合中删除

看例子

1.抽象观察目标

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
import java.util.*; public abstract class MySubject
{
protected ArrayList observers = new ArrayList(); //注册方法
public void attach(MyObserver observer)
{
observers.add(observer);
} //注销方法
public void detach(MyObserver observer)
{
observers.remove(observer);
} public abstract void cry(); //抽象通知方法
}

2.具体观察目标,猫

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class CatSubject extends MySubject{
public void cry() {
System.out.println("猫叫!");
System.out.println("----------------------");
for(Object obj:observers) {
((MyObserver)obj).response();
}
}
}

3.抽象观察者

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public interface MyObserver
{
void response(); //抽象响应方法
}

4.具体观察者

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class DogObserver implements MyObserver{
public void response() {
System.out.println("狗跟着叫!");
}
}
package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class PigObserver implements MyObserver{
public void response() {
System.out.println("猪也哄哄乱叫!");
}
}

5.调用过程

package Observer;

/**
* Created by Jiqing on 2016/10/28.
*/
public class Client {
public static void main(String a[])
{
MySubject subject=new CatSubject(); MyObserver obs1,obs2;
obs1=new DogObserver();
obs2=new PigObserver(); subject.attach(obs1);
subject.attach(obs2); subject.cry();
}
}

执行结果:

猫叫!
----------------------
狗跟着叫!
猪也哄哄乱叫!

点评:

猫叫带动狗叫和猪叫~

例子不在于多复杂,在于能把概念阐述清晰。

看关系图

JAVA设计模式之【观察者模式】的更多相关文章

  1. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  2. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  5. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  6. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  7. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  8. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

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

    Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...

  10. java设计模式:观察者模式

    package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...

随机推荐

  1. VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能

    出处: https://msdn.microsoft.com/zh-cn/magazine/dn973013(en-us).aspx 很多开发商花了绝大多数时间获取应用程序才干正常发挥作用.更少的时间 ...

  2. 指针,c语言的灵魂

    指针是一个值为内存地址的变量. 变量是一块内存空间,指针是变量,是用来存储内存地址的变量. #include <stdio.h> #include <stdlib.h> int ...

  3. 英语发音规则---B字母

    英语发音规则---B字母 一.总结 一句话总结: 1.B发[b]音? bike [baɪk] n. 自行车 bus [bʌs] n. 公共汽车 bag [bæg] n. 袋:猎获物 baby ['be ...

  4. oracle 11gR2 如何修改 private ip

    1.1    修改 private ip1.1.1  确保crs集群是打开的可以用olsnodes –s 检查集群的状态./olsnodes -sP570a ActiveP570b Active1.1 ...

  5. 16. 3Sum Closest[M]最接近的三数之和

    题目 Given an array nums of n integers and an integer target, find three integers in nums such that th ...

  6. C#将内容导出到Word到指定模板

    昨天做了下导入导出Excel文件,今天研究了下导出Word文件. 从网上找了半天才找到了一个能导出到指定模板的,在这里总结下. 导出模板原理就是利用的替换占位符. 我这里先建立好了一个模板, 接下来写 ...

  7. 迁移oracle数据库至新分区

    本文地址: http://www.cnblogs.com/blackmanba/p/move-oracle-database.html或者http://forkme.info/move-oracle- ...

  8. Linux常见后缀缩写含义

    ctl: control rc: run control (A run-control file is a file of declarations or commands associated wi ...

  9. 关于优化for循环的注意的事项

    for循环注意事项: 1.for循环内部尽量少做数据库查询之类的IO代价大的操作 2.尽量控制for循环的次数,不多做无用功 3.能一次加载在内存中的,就不要通过循环来多次查询数据库,除非数据量过大. ...

  10. C# 基础复习 二 面向对象

    继承:子承父业  子:子类    父:父类    业:所有非私有成员 好处:代码的复用   继承后,实例化子类时,不止子类的构造,父类的构造也会执行,而且父类的构造先于子类的构造执行 即使在子类可以看 ...