设计模式之观察者模式

来源:互联网 发布:rimworld mac a14 编辑:程序博客网 时间:2024/06/05 22:39

观察者模式又叫做发布-订阅(Publish/Subscribe)模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察对象,使它们能够更新自己。
这里写图片描述

Subject类、可翻译为主题或通知者,一般用一个抽象类或者接口实现。它把所有对观察着对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者。

public abstract class Subject {    private ArrayList<Observer> observers=new ArrayList<Observer>();    //增加观察者    public void Attach(Observer observer)    {        observers.add(observer);    }    //移除观察者    public void Detch(Observer observer)    {        observers.remove(observer);    }    //通知    public void Notify()    {        for(Observer observer:observers)        {            observer.Update();        }    }}

Observer类,抽象观察者,为所有的具体观察者定义一个更新方法(抽象方法,由具体观察者自己去实现)

public abstract class Observer {    public abstract void Update();}

ConcreteSubject类,叫做具体主题或者具体通知者,将有关状态存入具体观察者对象;在具体的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。

public class ConcreteSubject extends Subject{    private String subjectState;    public String getSubjectState() {        return subjectState;    }    public void setSubjectState(String subjectState) {        this.subjectState = subjectState;    }}

ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新方法,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。

public class ConcreteObserver extends Observer {    private String name;    private String observerState;    private ConcreteSubject subject;    public ConcreteObserver(ConcreteSubject subject,String name)    {        this.subject=subject;        this.name=name;    }    @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;    }}

main 函数代码

public static void main(String[] args) {        ConcreteSubject s=new ConcreteSubject();        ConcreteObserver X=new ConcreteObserver(s, "X");        ConcreteObserver Y=new ConcreteObserver(s, "Y");        ConcreteObserver Z=new ConcreteObserver(s, "Z");        s.Attach(X);        s.Attach(Y);        s.Attach(Z);        s.setSubjectState("Running");        s.Notify();    }

运行结果:
观察者X检测到主题的状态是Running
观察者Y检测到主题的状态是Running
观察者Z检测到主题的状态是Running

原创粉丝点击