Head First设计模式学习笔记——观察者模式

Head First设计模式学习笔记——观察者模式简单理解

问题来源:
    如何建立对象之间的一对多的依赖关系,使得当一个对象改变状态时,其他依赖它的对象都能收到通知并自动更新。比如,在下图中Subject(主题)和Observer1(观察者)、Observer2、Observer3存在一对多的依赖关系,当Subject的状态改变时,如何通知3个Observer更新各自的状态。观察者模式就是用于解决上述问题。

Head First设计模式学习笔记——观察者模式_第1张图片

    在学习观察者模式前,先试着用普通方法解决这个问题,代码如下:
public class Subject {

    private int state; 
    private Observer1 observer1;
    private Observer2 observer2;
    private Observer3 observer3;
    // ...    

    public void stateChanged() {
        observer1.update(state);
        observer2.update(state);
        observer3.update(state);
    }
    // ...
}
   上述代码中,Subject类拥有3个成员变量Observer1、Observer2和Observer3,当Subject的状态改变时,执行stateChanged()方法,通过3个observer对象的update()方法更新状态。当Observer的数量少且不经常更新时,上述方法的确可以解决问题,但是当Observer数量大且经常更新时,就需要修改大量的代码了,可以说该方法无法动态地增加(或删除)Observer对象。因此,需要在Subject中添加管理Observer的方法,类图如下:
    Head First设计模式学习笔记——观察者模式_第2张图片

    对象使用Subject接口注册成为Observer(观察者),或者把自己从观察者中删除。每个Subject对应管理多个Observer,当Subject的状态改变时,通知Observer做相应的更新。完整的代码如下:
Subject.java:
public interface Subject {
    public void registerObserver(Observer o); //注册观察者
    public void removeObserver(Observer o);  //移除观察者
    public void notifyObservers(); //通知全部观察者改变状态
}
Observer.java:
public interface Observer {
    public void update(int state); //观察者更新自己的状态
}
ConcreteSubject.java:
import java.util.ArrayList;

public class ConcreteSubject implements Subject {
    private ArrayList observerList;
    private int state = 0;

    public ConcreteSubject() {
    	observerList = new ArrayList();
    }

    public int getState() {
        return this.state; 
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();    
    }

	public void registerObserver(Observer o) {
        observerList.add(o); 
    }
	
	public void removeObserver(Observer o) {
	    int i = observerList.indexOf(o);
	    if(i >=0) {
		    observerList.remove(i);	
	    } 
        
	}

	public void notifyObservers() {
        for(int i = 0; i < observerList.size(); i++) {
            Observer observer = (Observer) observerList.get(i);
            observer.update(state);
        }
	}
}
Observer1.java:
public class Observer1 implements Observer {
    private int state = 0;
    private Subject subject;
    
    public Observer1(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    public int getState() {
        return this.state;
    }

    public void update(int state) {
        this.state = state;
    }

}
Observer2.java:
public class Observer2 implements Observer {
    private int state = 0;
    private Subject subject;

    public Observer2(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    public int getState() {
        return this.state;
    }

    public void update(int state) {
        this.state = state;
    }

}
test.java:
public class test {

    public static void main(String[] args) {

        //实例化ConcreteSubject
        ConcreteSubject subject = new ConcreteSubject();

        //实例化 Observer1 和 Observer2
        Observer1 observer1 = new Observer1(subject);
        Observer2 observer2 = new Observer2(subject);

        System.out.println(subject.getState());
        System.out.println(observer1.getState());
        System.out.println(observer2.getState());

        //设置subject state的值为1
        subject.setState(1);
	
        System.out.println(subject.getState());
        System.out.println(observer1.getState());
        System.out.println(observer2.getState());

        //subject中删除observer2
        subject.removeObserver(observer2);
        subject.setState(2);//修改subject的state值为2
	
        System.out.println(subject.getState());
        System.out.println(observer1.getState());
        System.out.println(observer2.getState());
    }
}
运行结果如下:

Head First设计模式学习笔记——观察者模式_第3张图片


    分析结果,初始时,subject、observer1和observer2的state均为0;当subject的state改为1时,observer1和observer2的state也更新为1; 之后,从subject中删除observer2,改变subject的state为2,此时observer1的state被更新为2,而observer2的state还是上一个结果1。

参考自:
Head First设计模式学习笔记——观察者模式_第4张图片





        

你可能感兴趣的:(Design,Patterns,Java,面试题梳理)