观察者模式

一、作用:

当一个对象发生变化时,其他对该对象有依赖关系的所有对象会收到通知,一起发生变化。这是一种一对多的关系。

二、代码示例:

注:我们的示例中,被观察的是MySubject类中的变量state。
需求是:当state的值改变时,观察者(ObserverA、ObserverB)中的ObjectState随之一起发生改变。

被观察者

/**
 * 被观察者类需要实现的接口
 */
public interface Subject {
    //添加观察者
    public void add(Observer e);
    
    //删除观察者
    public void del(Observer e);
    
    //通知所有观察者
    public void notifyAllObserver(String newState);
}

/**
 * 被观察者抽象类,所有需要被观察的类都要继承该抽象类
 */
public class AbstractSubject implements Subject{

    List<Observer> list = new ArrayList<>();
    
    public void add(Observer e) {
        list.add(e);
    }

    public void del(Observer e) {
        list.remove(e);
    }

    public void notifyAllObserver(String newState) {
        //告知所有观察者:被观察者已经发生更新,请一同更新
        for(Observer obs : list) {
            obs.update(newState);
        }
    }
}

package observer;
/**
 * 被观察的类
 */
public class MySubject extends AbstractSubject{
    //被观察的变量,如果该值变化,观察者中的值也相应的发生变化
    private String state = "未更新!";
    
    public String getState() {
        return state;
    }
    
    public void changeState(String newState) {
        this.state = newState;
        notifyAllObserver(newState);
    }
}

观察者

/**
 * 观察者接口,所有的观察者都要实现该接口
 */
public interface Observer {
    //更新观察者状态
    public void update(String newState);
}

/**
 * 具体的观察者A
 */
public class ObserverA implements Observer{
    //该变量随被观察者中被观察变量的变化而变化
    private String observerState = "未更新!";
    
    public void update(String newState) {
        //更新观察者状态,使他与被观察者状态保持一致
        this.observerState = newState;
    }
}

/**
 * 具体的观察者B
 */
public class ObserverB implements Observer{
    ////该变量随被观察者中被观察变量的变化而变化
    private String observerState = "未更新!";
    
    public void update(String newState) {
        //更新观察者状态,使他与被观察者状态保持一致
        this.observerState = newState;
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        MySubject sub = new MySubject();
        ObserverA obA = new ObserverA();
        ObserverB obB = new ObserverB();
        System.out.println("被观察者" + sub.getState());
        System.out.println("观察者" + sub.getState());
        System.out.println("观察者" + sub.getState());
        
        sub.changeState("已更新!");
        
        System.out.println("被观察者" + sub.getState());
        System.out.println("观察者" + sub.getState());
        System.out.println("观察者" + sub.getState());
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容