设计模式之观察者模式
来源:互联网 发布:数据堂 山东信息贩卖案 编辑:程序博客网 时间:2024/05/21 23:33
简介
观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
模式中的角色
1、抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2、具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
3、抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
4、具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
UML类图
适应场景
1、当一个对象的数据更新时需要通知其他对象,但又不希望和被通知对象形成紧密的耦合。
2、当一个对象的数据更新时,这个对象需要让其他对象也更新各自的数据,但这个对象不知道到底有多个对象需要更新数据。
示例代码
主题:Subject类
/**
* Created by zhu on 4/3/2016.
*/
public interface Subject {
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservere(Observer o);
}
* Created by zhu on 4/3/2016.
*/
public interface Subject {
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservere(Observer o);
}
具体主题:SeekJobCenter
/**
* Created by zhu on 4/3/2016.
*/
* Created by zhu on 4/3/2016.
*/
public class SeekJobCenter implements Subject {
ArrayList<Observer> observers;
String mess;
boolean changed;
public SeekJobCenter() {
observers = new ArrayList<Observer>();
mess = "";
changed = false;
}
@Override
public void addObserver(Observer o) {
if (!observers.contains(o)){
observers.add(o);
}
}
@Override
public void deleteObserver(Observer o) {
if (observers.contains(o)){
observers.remove(o);
}
}
@Override
public void notifyObservere(Observer o) {
if (changed){
for (int i=0;i<observers.size();i++){
Observer observer = observers.get(i);
observer.hearTelephone(mess);
}
changed = false;
}
}
public void giveMess(String str){
if (str.equals(mess)){
changed = false;
}
else {mess = str;
changed = true;
}
}
}
ArrayList<Observer> observers;
String mess;
boolean changed;
public SeekJobCenter() {
observers = new ArrayList<Observer>();
mess = "";
changed = false;
}
@Override
public void addObserver(Observer o) {
if (!observers.contains(o)){
observers.add(o);
}
}
@Override
public void deleteObserver(Observer o) {
if (observers.contains(o)){
observers.remove(o);
}
}
@Override
public void notifyObservere(Observer o) {
if (changed){
for (int i=0;i<observers.size();i++){
Observer observer = observers.get(i);
observer.hearTelephone(mess);
}
changed = false;
}
}
public void giveMess(String str){
if (str.equals(mess)){
changed = false;
}
else {mess = str;
changed = true;
}
}
}
观察者:Observer类
public interface Observer {
public void hearTelephone(String mess);
}
public void hearTelephone(String mess);
}
具体观察者:Student 类
public class Student implements Observer {
Subject subject;
File file;
public Student(Subject subject,String fileName) {
this.subject = subject;
file = new File("file");
}
@Override
public void hearTelephone(String mess) {
}
}
Subject subject;
File file;
public Student(Subject subject,String fileName) {
this.subject = subject;
file = new File("file");
}
@Override
public void hearTelephone(String mess) {
}
}
具体观察者:HaiGui
public class HaiGui implements Observer {
Subject subject;
File file;
public HaiGui(Subject subject,String fileName) {
this.subject = subject;
file = new File("file");
}
@Override
public void hearTelephone(String mess) {
}
}
Subject subject;
File file;
public HaiGui(Subject subject,String fileName) {
this.subject = subject;
file = new File("file");
}
@Override
public void hearTelephone(String mess) {
}
}
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- Android知识体系图
- C# TCP实现多个客户端与服务端 数据 传输
- Java笔记——Runnable、Callable以及Future、FutureTask
- Android 命名规范 (提高代码可以读性)
- 授权虚拟机链接本地
- 设计模式之观察者模式
- 解决几个编译警告我和错误问题
- iOS绘图教程
- MIPS汇编指令打印hello world
- python监控进程
- 《网络工程师》 Part2 数据通信
- ZOJ-3929-Deque and Balls【思维】【好题】
- LeetCode 290. Word Pattern
- SVN:This client is too old to work with working copy…解决方法