定义
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
角色
抽象主题(ISubject)
定义主题中的要实现的方法,包括保存所有的观察者,观察者注册,取消注册(增删)等。
主题类(ConcreteSubject)
实现了抽象主题中的具体方法。
抽象观察者(IObserver)
定义观察者要实现的方法,比如:更新,修改,回滚,显示等方法。
观察者类(ConcreteObserver)
实现抽象观察者中的具体方法。
类图
示例
观察者模式算是比较好理解的一种模式。简单示例如下:
public interface ISubject{
void addObserver(IObserver obs);
void delObserver(IObserver obs);
void removerAll();
void notifyAll();
public class Subject implements ISubject{
List<IObserver> observerList = new ArraryList<IObserver>();
private int count;
void addObserver(IObserver obs)
{
observerList .add(obs);
}
void delObserver(IObserver obs)
{
observerList .remover(obs);
}
void removerAll()
{
observerList.clear();
}
public void notifyAll()
{
for(IObserver obs:allObserver)
{
obs.update(count);
obs.display(count);
}
}
public void setChange(int count)
{
this.count = count;
notifyAll();
}
public interface IObserver()
{
boolean update(int count);
boolean display(int count);
}
public class Observer implements IObserver
{
private Subject subject = null;
public Observer(Subject sub)
{
this.subject = sub;
subject.addObserver(this);
}
private IDataDao dataDao = new DataDao();
public boolean update(int count)
{
dataDao.update(count); //假设更新数据库
}
public boolean display(int count)
{
System.out.println("display " + count);
}
}
public class Test {
public static void main(String[] args){
Subject subject = new Subject();
Observer observer = new Observer(subject);
int count = 20;
subject.setChange(count);
int count2 = 30;
subject.setChange(count2);
}
}
要点
1.定义了对象之间一对多的关系
2.观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了接口中的方法
3.有多个观察者时,不可以依赖特定的统治次序
本文详细介绍了观察者模式,包括定义、角色解析、类图展示及应用示例。观察者模式定义了一对多的依赖关系,当主题状态改变时,所有依赖者将自动更新。抽象主题ISubject负责保存观察者并管理注册和取消注册,ConcreteSubject实现具体操作。抽象观察者IObserver规定了更新方法,ConcreteObserver则实现这些方法。通过该模式,可实现观察者与被观察者之间的松耦合。
1375

被折叠的 条评论
为什么被折叠?



