设计模式之观察者模式(笔记)
当对象间存在一对多关系的时候,则使用观察者模式,比如当一个对象被修改的时候,则会自动通知他的依赖对象。观察者模式属于行为模式。
介绍:定义一种对象间的一种一对多的依赖关系,当一个对象发生改变时,所有依赖于他的对象都得到通知并且被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且考虑到易用和低耦合,保证高度的协作。
如何解决:使用面向对象计数,可以将这种关系弱化。
关键代码:在一个抽象类里边有一个ArrayList存放观察者们。
优点:观察者和被观察者时抽象耦合的,建立一套触发机制。
自己总结:被观察者和观察者是一对多的关系,一个被观察者被多个观察者观察,因此这个被观察者需要使用List等集合持有所有观察他的观察者的引用,这样,当调用setState()方法的时候,就能够调用它的notifyAllObserver()方法,并在这个方法里边遍历List的所有集合,调用他们的Update方法。这就是对观察者方法的简单理解吧。
//Subject 被观察者
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers=new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state=state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for(Observer observer:observers) {
observer.update();
}
}
}
//观察者
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
//观察者实现类
public class HexaObserver extends Observer{
public HexaObserver(Subject subject) {
// TODO Auto-generated constructor stub
this.subject=subject;
this.subject.attach(this);
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("HeX String :"+Integer.toHexString(subject.getState()).toUpperCase());
}
}
//demo
public class ObeserverPatternDemo {
public static void main(String[] args) {
Subject subject=new Subject();
new HexaObserver(subject);
System.out.println("the state change :99");
subject.setState(99);
}
}