一、定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。主要应用在java的AWT事件机制。

二、角色

  • 抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
  • 具体主题角色(RealSubject):在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
  • 抽象观察者角色(Observer):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
  • 具体观察者角色(RealObserver):该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现。

三、代码演示

抽象观察者角色(Observer)

/**
* 抽象观察者角色
* @author zhangkang
*
*/
public interface MyObserver {
void update(String message,String subjectName);
}

具体观察者角色1(RealObserver1)

/**
* 具体观察者1
* @author zhangkang
*
*/
public class RealObserver1 implements MyObserver{ private String name; public RealObserver1(String name) {
this.name = name;
} @Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}

具体观察者角色2(RealObserver2)

/**
* 具体观察者2
* @author zhangkang
*
*/
public class RealObserver2 implements MyObserver{ private String name; public RealObserver2(String name) {
this.name = name;
} @Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}

抽象主题角色(Subject)

/**
* 抽象主题角色
* @author zhangkang
*
*/
public interface MySubject {
void addObserver(MyObserver o); //添加观察者
void deleteObserver(MyObserver o); //删除观察者
void notifyObservers(String message); //通知所有的观察者
}

具体主题角色(RealSubject)

import java.util.ArrayList;
import java.util.List;
/**
* 具体主题
* @author zhangkang
*
*/
public class RealSubject implements MySubject{ private String subjectName = "官方"; //主题名称 private List<MyObserver> list; //集合用来保存每个观察者 public RealSubject() {
list = new ArrayList<MyObserver>();
} @Override
public void addObserver(MyObserver o) {
list.add(o);
} @Override
public void deleteObserver(MyObserver o) {
list.remove(o);
} @Override
public void notifyObservers(String message) {
for (MyObserver myObserver : list) {
myObserver.update(message, subjectName);
}
}
}

客户端测试

/**
* 客户端测试
* @author zhangkang
*
*/
public class Test {
public static void main(String[] args) {
//定义两个观察者
MyObserver o1 = new RealObserver1("段友1");
MyObserver o2 = new RealObserver2("段友2"); //定义一个主题
MySubject subject = new RealSubject();
//添加观察者
subject.addObserver(o1);
subject.addObserver(o2);
//发布消息通知观察者
subject.notifyObservers("内涵段子TV已下架!");
}
} 输出:
段友1:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
段友2:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】

最新文章

  1. linux命令crontab
  2. TortoiseGit 连接oschina不用每次输入用户名和密码的方法
  3. javascript获取当前时间
  4. Android中加载位图的方法
  5. C++ Dialog Box Command IDs
  6. lbp特征提取(等价模式)
  7. Lintcode221 Add Two Numbers II solution 题解
  8. 分布式缓存管理平台XXL-CACHE
  9. June 28th. 2018, Week 26th. Thursday
  10. Django学习笔记(8)——前后台数据交互实战(AJAX)
  11. java二分法搜索
  12. bzoj2252 矩阵距离
  13. Nginx配置SSL证书实现https访问「浏览器未认证」
  14. win10 下安装 neo4j(转)
  15. MSSQL Server 数据库备份还原常用SQL语句及注意
  16. 潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)
  17. NR 数据库简介
  18. Qt for Embedded Linux
  19. jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容
  20. linux基础命令学习 (九)文本操作

热门文章

  1. 物体检测丨从R-CNN到Mask R-CNN
  2. JS中比较的数值如何比较大小
  3. 将SpringBoot默认使用的tomcat替换为undertow
  4. Linux下常用的数据恢复工具
  5. 判断浏览器是pc端还是移动端
  6. Cordova for iOS
  7. jsp跳转标签&lt;jsp:forward&gt;
  8. ASP.NET WebForm &amp; MongoDB
  9. 通过WMIC导出系统日志
  10. UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)