设计模式-观察者模式Observer
2016-04-13 16:43
375 查看
观察者模式(Observer),又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
实现代码:
Subject类,主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
package observer.demo;
/*
* 主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,
* 每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
* */
import java.util.ArrayList;
public abstract class Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
//增加观察者
public void attach(Observer observer){
observers.add(observer);
}
//移除观察者
public void detach(Observer observer){
observers.add(observer);
}
//通知
public void notifyObs(){
for(Observer obs:observers){
obs.update();
}
}
}
/*
* 抽象观察者,为所有的具体观察者定义一个接口,在得到主题通知时更新自己,这个接口叫做抽象接口,抽象观察者一般用一个抽象类或者一个接口实现,
* 更新接口通常包含一个update方法,这个方法叫更新方法*/
public abstract class Observer {
public abstract void update();
}
/*
* 具体主题或者具体通知者,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。
* */
public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
//客户端代码
public static void main(String[] args){
ConcreteSubject mConcreteSubject = new ConcreteSubject();
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"AAA"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"BBB"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"CCC"));
mConcreteSubject.setSubjectState("状态不错哦!");
mConcreteSubject.notifyObs();
}
}
/*
* 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态和主题的状态相协调,具体观察者角色可以保存一个指向具体主题对象的引用。
* */
public class ConcreteObserver extends Observer
c94b
{
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name){
this.name = name;
this.subject = subject;
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
@Override
public void update() {
observerState = subject.getSubjectState();
System.out.println("观察者 "+name+" 的新状态 "+observerState);
}
}
那么为什么要使用观察者模式?将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护,扩展和重用带来不便。而观察者模式的关键对象是主题subject和观察者observer,一个subject可以有任意数量的依赖他的observer,一旦subject的状态发生变化,所有的observer都可以得到通知。subject发出通知时,并不需要知道谁是他的观察者observer,也就是说,具体观察者是谁,他根本就不需要知道。而任何一个具体的观察者,也不需要知道其他观察者的存在。
什么时候应该使用观察者模式?就是当一个对象的改变需要同时改变其他对象的时候。而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。
观察者模式所要做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
实现代码:
Subject类,主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
package observer.demo;
/*
* 主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,
* 每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
* */
import java.util.ArrayList;
public abstract class Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
//增加观察者
public void attach(Observer observer){
observers.add(observer);
}
//移除观察者
public void detach(Observer observer){
observers.add(observer);
}
//通知
public void notifyObs(){
for(Observer obs:observers){
obs.update();
}
}
}
/*
* 抽象观察者,为所有的具体观察者定义一个接口,在得到主题通知时更新自己,这个接口叫做抽象接口,抽象观察者一般用一个抽象类或者一个接口实现,
* 更新接口通常包含一个update方法,这个方法叫更新方法*/
public abstract class Observer {
public abstract void update();
}
/*
* 具体主题或者具体通知者,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。
* */
public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
//客户端代码
public static void main(String[] args){
ConcreteSubject mConcreteSubject = new ConcreteSubject();
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"AAA"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"BBB"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"CCC"));
mConcreteSubject.setSubjectState("状态不错哦!");
mConcreteSubject.notifyObs();
}
}
/*
* 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态和主题的状态相协调,具体观察者角色可以保存一个指向具体主题对象的引用。
* */
public class ConcreteObserver extends Observer
c94b
{
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name){
this.name = name;
this.subject = subject;
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
@Override
public void update() {
observerState = subject.getSubjectState();
System.out.println("观察者 "+name+" 的新状态 "+observerState);
}
}
那么为什么要使用观察者模式?将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护,扩展和重用带来不便。而观察者模式的关键对象是主题subject和观察者observer,一个subject可以有任意数量的依赖他的observer,一旦subject的状态发生变化,所有的observer都可以得到通知。subject发出通知时,并不需要知道谁是他的观察者observer,也就是说,具体观察者是谁,他根本就不需要知道。而任何一个具体的观察者,也不需要知道其他观察者的存在。
什么时候应该使用观察者模式?就是当一个对象的改变需要同时改变其他对象的时候。而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。
观察者模式所要做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
相关文章推荐
- CentOS 7 的 firewalld防火墙(转载)
- java package实验
- CF 281A Word Capitalization
- AR手机应用安装包大小优化
- 用百度SDK获取地理位置和天气信息
- 数据结构与算法-第12章二叉树和其他树-001遍历集合的所有子集
- Reveal逆向工程:分析任意iOS应用的UI界面
- Theano 学习笔记(一)
- PHP中使用递归函数
- leetcode 101. Symmetric Tree
- poj 3356 AGTC 简单dp
- 记一次Weblogic连接池泄露的修复过程
- Tickets 基础DP
- 华为手机在连接Eclipse时,Logcat中看不到相关日志
- 前端界面调试步骤
- 视频处理——ffmpeg
- [C]常用字符串函数
- hdu 1245 Saving James Bond
- 84、PullToRefresh使用详解
- java获取一个字符串在另一个字符串中出现的次数