1. Java自带的实现

类图

/**
* 观察目标 继承自 java.util.Observable
* @author stone
*
*/
public class UpdateObservable extends Observable { private int data; public UpdateObservable(Observer observer) {
addObserver(observer);
/*
* add other observer
*/
} public int getData() {
return data;
} public void setData(int data) {
if (data != this.data) {
this.data = data;
setChanged(); //标记 改变, 仅仅有标记后才干通知到
notifyObservers(); //通知
} } @Override
public synchronized void addObserver(Observer o) {
super.addObserver(o);
} @Override
public synchronized void deleteObserver(Observer o) {
super.deleteObserver(o);
} @Override
public void notifyObservers() {
super.notifyObservers();
} @Override
public void notifyObservers(Object arg) {
super.notifyObservers(arg);
} @Override
public synchronized void deleteObservers() {
super.deleteObservers();
} @Override
protected synchronized void setChanged() {
super.setChanged();
} @Override
protected synchronized void clearChanged() {
super.clearChanged();
} @Override
public synchronized boolean hasChanged() {
return super.hasChanged();
} @Override
public synchronized int countObservers() {
return super.countObservers();
} }
/**
* 观察者 实现 java.util.Observer接口
* @author stone
*
*/
public class UpdateObserver implements Observer { @Override
public void update(Observable o, Object arg) {
System.out.println("接收到数据变化的通知:");
if (o instanceof UpdateObservable) {
UpdateObservable uo = (UpdateObservable) o;
System.out.print("数据变更为:" + uo.getData());
}
} }

2. 自己定义的观察模型

类图

/**
* 抽象观察者 Observer
* 观察 更新
* @author stone
*
*/
public interface IWatcher {
/*
* 通知接口:
* 1. 简单通知
* 2. 观察者须要目标的变化的数据,那么能够将目标用作參数, 见Java的Observer和Observable
*/
// void update(IWatched watched); void update(); }
/**
* 抽象目标 Subject
* 提供注冊和删除观察者对象的接口, 及通知观察者进行观察的接口
* 及目标 自身被观察的业务的接口
* @author stone
*
*/
public interface IWatchedSubject { public void add(IWatcher watch); public void remove(IWatcher watch); public void notifyWhatchers(); public void update();//被观察业务变化的接口
}
/**
* 详细观察者 Concrete Observer
*
* @author stone
*
*/
public class UpdateWatcher implements IWatcher { @Override
public void update() {
System.out.println(this + "观察到:目标已经更新了");
} }
/**
* 详细目标角色 Concrete Subject
* @author stone
*
*/
public class UpdateWatchedSubject implements IWatchedSubject {
private List<IWatcher> list; public UpdateWatchedSubject() {
this.list = new ArrayList<IWatcher>();
} @Override
public void add(IWatcher watch) {
this.list.add(watch);
} @Override
public void remove(IWatcher watch) {
this.list.remove(watch);
} @Override
public void notifyWhatchers() {
for (IWatcher watcher : list) {
watcher.update();
}
} @Override
public void update() {
System.out.println("目标更新中....");
notifyWhatchers();
} }

监听器是观察者的一种实现

类图

/**
* 监听 用户在注冊后
* @author stone
*
*/
public interface IRegisterListener {
void onRegistered();
}

/**
* 监听 当用户登录后
* @author stone
*
*/
public interface ILoginListener {
void onLogined();
}
/*
* 监听器 是观察者模式的一种实现
* 一些须要监听的业务接口上加入 监听器,调用监听器的对应方法,实现监听
*/
public class User { public void register(IRegisterListener register) {
/*
* do ... register
*/
System.out.println("正在注冊中...");
//注冊后
register.onRegistered();
} public void login(ILoginListener login) {
/*
* do ... login
*/
System.out.println("正在登录中...");
//登录后
login.onLogined();
} }
/**
* 观察者(Observer)模式 行为型模式
* 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同一时候观察某一个目标对象。
* 这个目标对象在状态上发生变化时,会通知全部观察者对象,让它们可以自己主动更新自己
* 目标对象中须要有加入、移除、通知 观察者的接口
*
* @author stone
*/
public class Test { public static void main(String[] args) {
/*
* 使用Java自带的Observer接口和Observable类
*/
UpdateObservable observable = new UpdateObservable(new UpdateObserver());
observable.setData(99);
System.out.println("");
System.out.println("");
/*
* 自己定义的观察者模型
*/
IWatchedSubject watched = new UpdateWatchedSubject();
watched.add(new UpdateWatcher());
watched.add(new UpdateWatcher());
watched.update();
System.out.println(""); /*
* 子模式-监听器
*/ User user = new User();
user.register(new IRegisterListener() { @Override
public void onRegistered() {
System.out.println("监听到注冊后。。。");
}
});
user.login(new ILoginListener() { @Override
public void onLogined() {
System.out.println("监听到登录后。。。");
}
}); }
}

打印

接收到数据变化的通知:
数据变更为:99 目标更新中....
observer.UpdateWatcher@457471e0观察到:目标已经更新了
observer.UpdateWatcher@5fe04cbf观察到:目标已经更新了 正在注冊中...
监听到注冊后。。。
正在登录中...
监听到登录后。。。

Java 实现观察者(Observer)模式的更多相关文章

  1. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  2. 观察者(Observer)模式

    观察者模式又叫做发布-订阅模式(Publish.Subscribe)模式.模型-视图模式(Model/View)模式.源-监听器模式(Source/Listener)模式或从属者(Dependents ...

  3. 设计模式C++描述----04.观察者(Observer)模式

    一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...

  4. java观察者(Observer)模式

    观察者模式:     试想,在电子商务网站上,一个用户看中了一件一份,但是当时衣服的价格太贵,你需要将衣服收藏,以便等衣服降价时自动通知该用户.这里就是典型的观察模式的例子.     1.观察者模式的 ...

  5. Java观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  6. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  7. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  8. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  9. 《Head First 设计模式》ch.2 观察者(Observer)模式

    观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...

随机推荐

  1. 【Eclipse】Tomcat 改变发布路径

    关闭服务,删除里面的所有项目,clean,然后双击服务,发布路径修改就可以点击了.当重新发布了项目后,发布路径修改的按钮又会恢复不可点击状态.

  2. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

  3. Ubuntu15.04上为火狐浏览器安装Adobe Flash Player插件

    前言:最新版的ubuntu好像没有flashplayer,而且更新源也无法更新成功,找些资料终于发现 这个需要自己手动配置.由于flashplayer无法安装,导致视频,百度上传等功能都无法使用: 安 ...

  4. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  5. VS 2013--工程的创建,scanf报错,常用快捷键,行号设置

    一.创建一个工程(这里是C++,其他的一样的) 在vs页面上点击 文件-->新建-->项目: 会出现如下界面,自己改名字和存贮位置就可以了 确定,然后点击下一步: 这样就建好了一个工程,然 ...

  6. 翻页采用jaxa

    <!-- 翻页采用jaxa --><script type="text/javascript">//class="page"下面的a被点 ...

  7. Chapter 5.依赖倒转原则

    抽象不应该依赖谢姐,细节应该依赖于抽象:针对接口编程,不要对实现编程.例如电脑内的内存坏了不会影响到其它模块,而且什么品牌都可以插入内存插槽,而不仅限于某个品牌的内存条. A.高层模块不应该依赖底层模 ...

  8. Python 数据处理扩展包: pandas 模块的DataFrame介绍(创建和基本操作)

    DataFrame是Pandas中的一个表结构的数据结构,包括三部分信息,表头(列的名称),表的内容(二维矩阵),索引(每行一个唯一的标记). 一.DataFrame的创建 有多种方式可以创建Data ...

  9. 上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工作看过来初级资深都有 - V2EX

    上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工作看过来初级资深都有 - V2EX 上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工 ...

  10. Debian为程序添加一个开始菜单,debian添加sublime开始菜单.

    下了一个 '绿色' 的程序,想要加到开始菜单里面. 怎么做呢? 我这里以sublime2做例 去http://www.sublimetext.com/2 下载了linux 64位, 解压放到了下面的文 ...