一、概念:
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
主要参与角色:观察者(Observer)与 被观察者(Observable)
二、代码DEMO:
1、观察者接口类:Observer.java
package com.ice.patterns.observer;
/**
* 设计模式之 观察者模式学习<br>
* 定义观察者 通用接口
* @author ice
*
*/
public interface Observer {
/**
* 一发现别人<被观察者>有动静,自己也要行动起来
* @param content
*/
public void update(String content);
}
2、被观察者接口类:Observable.java
package com.ice.patterns.observer;
/**
* 设计模式之 观察者模式学习<br>
* 定义被观察者 通用接口
* @author ice
*
*/
public interface Observable {
/**
* 增加/注册一个观察者
* @param observer
*/
public void addObserver(Observer observer);
/**
* 当被观察者不想被某某暗暗偷窥啦、便可删除/注销该观察者
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 通知观察者 我干了什么事 也就是我干了什么事都让观察者知道
* @param content
*/
public void notifyObservers(String content);
}
3、定义一个被观察者类:Xiaolv.java
package com.ice.patterns.observer;
import java.util.ArrayList;
/**
* 这里小吕把自己定义成 被观察者<br>
* 会被哪些人观察呢?呵呵... 女朋友?老爸?...
* @author ice
*
*/
public class Xiaolv implements Observable {
/** 存储所有添加的 观察者 */
private ArrayList<Observer> observerList = new ArrayList<Observer>();
/**
* 添加观察者
*/
@Override
public void addObserver(Observer observer) {
this.observerList.add(observer);
}
/**
* 删除观察者
*/
@Override
public void removeObserver(Observer observer) {
this.observerList.remove(observer);
}
/**
* 通知所有的观察者
*/
@Override
public void notifyObservers(String content) {
for(Observer observer : observerList){
observer.update(content);
}
}
/**
* 小吕<一个被观察者>在开心的玩游戏
*/
public void playGameHappy(){
System.out.println("小吕: 正在开心的玩游戏");
notifyObservers("小吕 正在玩游戏");
}
/**
* 小吕<一个被观察者>在努力的写代码
*/
public void hardCoding(){
System.out.println("小吕:正在努力的写代码");
notifyObservers("小吕 正在写代码");
}
}
4、定义二个观察者类:GirlFriend.java
package com.ice.patterns.observer;
/**
* 定义一个观察者类:小吕的女朋友
* @author ice
*
*/
public class GirlFriend implements Observer {
@Override
public void update(String content) {
System.out.println("小吕的女朋友观察到:"+content);
}
}
MyFather.java
package com.ice.patterns.observer;
/**
* 定义小吕的又一观察者类:我的老爸
* @author ice
*
*/
public class MyFather implements Observer {
@Override
public void update(String content) {
System.out.println("小吕的老爸观察到:"+content);
}
}
5、客户端测试类 Client.java
package com.ice.patterns.observer;
public class Client {
public static void main(String[] args) {
/** 定义两个观察者对象:小吕的女朋友和老爸 */
GirlFriend janice = new GirlFriend();
MyFather myDad = new MyFather();
/** 定义被观察者对象:小吕<ice> */
Xiaolv ice = new Xiaolv();
/** 添加janice去观察小吕 */
ice.addObserver(janice);
/** 添加老爸来观察小吕 */
ice.addObserver(myDad);
ice.playGameHappy();
System.out.println("-------------");
ice.hardCoding();
}
}
6、程序运行效果如下:
小吕: 正在开心的玩游戏
小吕的女朋友观察到:小吕 正在玩游戏
小吕的老爸观察到:小吕 正在玩游戏
-------------
小吕:正在努力的写代码
小吕的女朋友观察到:小吕 正在写代码
小吕的老爸观察到:小吕 正在写代码