观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
角色:
抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;
具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;
具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
Java自带的观察者模式:
import java.util.Observable;
// 主题角色 通知 观察者 我发生了改变
public class ThemeRole extends Observable{
public static void main(String[] args) {
ThemeRole t = new ThemeRole();
ObserverRole o = new ObserverRole();
MyInter o_2 = new MyInter();
t.setChanged();
t.addObserver(o);
t.addObserver(o_2);
t.notifyObservers("我是主题角色");
}
}
import java.util.Observable;
import java.util.Observer;
/*
* 观察者角色
*/
public class ObserverRole implements Observer{
// 更新方法
@Override
public void update(Observable o, Object arg) {
System.out.println("update:"+arg);
}
}
import java.util.Observable;
import java.util.Observer;
/**
*观察者角色
*/
public class MyInter implements Observer{
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("MyInter:"+arg);
}
}
自己设计的一种观察者模式:
实体类:用来传递消息
public class Bean {
private String name;
public Bean(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
抽象的观察者类
public interface Look {
void getMessage(Bean bean);
}
抽象的主题类
public interface Looked {
void addLook(Look look);
void removeLook(Look look);
void notifyMessage(Bean bean);
}
具体的观察者类
public class MyLook implements Look{
@Override
public void getMessage(Bean bean) {
// TODO Auto-generated method stub
System.out.println(bean.getName());
}
}
具体的主题类
import java.util.ArrayList;
import java.util.List;
public class MyLooked implements Looked{
List<Look> list_look = new ArrayList<Look>();
@Override
public void addLook(Look look) {
// TODO Auto-generated method stub
list_look.add(look);
}
@Override
public void removeLook(Look look) {
// TODO Auto-generated method stub
list_look.remove(look);
}
@Override
public void notifyMessage(Bean bean) {
// TODO Auto-generated method stub
for(Look lo:list_look){
lo.getMessage(bean);
}
}
}
测试类
public class Test {
public static void main(String[] args) {
MyLook m = new MyLook();
MyLooked med = new MyLooked();
med.addLook(m);
Bean bean = new Bean("测试");
med.notifyMessage(bean);
}
}