观察者模式
定义
定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新
结构
在最基础的观察者模式中,包括以下四个角色:
- 被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会与其他的模式混用,所以使用抽象类的情况比较多。
- 观察者:观察者角色一般是一个接口,它只有一个update方法,在被观察者状态发生变化时,这个方法就会被触发调用。
- 具体的被观察者:使用这个角色是为了便于扩展,可以在此角色中定义具体的业务逻辑。
- 具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。
类图
代码实现
观察者IObserver
public interface IObserver { void update(Subject subject); }
被观察者Subject
import java.util.ArrayList; import java.util.List; public abstract class Subject { private Integer state; private List<IObserver> observers=new ArrayList<IObserver>(); public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public List<IObserver> getObservers() { return observers; } public void setObservers(List<IObserver> observers) { this.observers = observers; } public void rigister(IObserver observer){ observers.add(observer); } public void remove(IObserver observer){ observers.remove(observer); } public void notifys(){ for(int i=0 ; i<observers.size() ;i++ ){ observers.get(i).update(this); } }; }
观察者具体实现
public class ObserverA implements IObserver{ @Override public void update(Subject subject) { System.out.println(subject.getState()); } }
被观察者具体实现
public class ConcreateSubject extends Subject{ public void setState (Integer state){ super.setState(state); notifys(); } }
测试代码
public class Main { public static void main(String[] args) { ObserverA observer1=new ObserverA(); ObserverA observer2=new ObserverA(); ObserverA observer3=new ObserverA(); ConcreateSubject subject=new ConcreateSubject(); subject.rigister(observer1); subject.rigister(observer2); subject.rigister(observer3); subject.setState(2); } }