赞
踩
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
观察者模式的主要角色如下:
抽象主题(Subject)角色: 也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色: 也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色: 它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色: 实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
抽象观察者Observer:
abstract class Observer
{
public abstract void Update();
}
抽象主题Subject:
public abstract class Subject
{
//增加观察者
public abstract void Attach(Observer observer);
//移除观察者
public abstract void Detach(Observer observer);
//通知
public abstract void Notify();
}
具体主题ConcreteSubject:
class ConcreteSubject extends Subject{ //被观察者的状态 private String subjectState; private List<Observer> observers = new ArrayList<Observer>(); public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } @Override public void Attach(Observer observer) { observers.add(observer); } @Override public void Detach(Observer observer) { observers.remove(observer); } @Override public void Notify() { for(Observer item:observers) { item.Update(); } } }
具体观察者ConcreteObserver:
public class ConcreteObserver extends Observer{ private String name; private String observerState; private ConcreteSubject subject; public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } @Override public void Update() { observerState=subject.getSubjectState(); System.out.println("观察者"+name+"的新状态是:"+observerState); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
测试:
public static void main(String[] args) {
//被观察者
ConcreteSubject cs=new ConcreteSubject();
//为cs增加三个观察者
cs.Attach(new ConcreteObserver("x",cs));
cs.Attach(new ConcreteObserver("y",cs));
cs.Attach(new ConcreteObserver("z",cs));
//cs发生变化
cs.setSubjectState("ss");
cs.Notify();
}
观察者x的新状态是:ss
观察者y的新状态是:ss
观察者z的新状态是:ss
主要优点:
主要缺点:
观察者模式的应用场景如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。