您的位置:首页 > 编程语言 > Java开发

JAVA 设计模式 观察者模式

2017-09-01 09:52 295 查看
用途

观察者模式 (Observer)
观察者模式定义了一种一对多依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式是一种行为型模式

结构

[align=center][/align]

图-观察者模式结构图

Subject : 主题类,保存所有订阅此主题的观察者,观察者的数量是任意的。定义添加观察者 (Attach) 删除观察者 (Detach) 的接口。

abstract class Subject {

    protected String name;

    protected String state;

    protected List<Observer> observers = new ArrayList<Observer>();

    

    public abstract String getState();    

    public abstract void setState(String state);

    public abstract void Notify();

    public Subject(String name) {

        this.name = name;

    }

    

    public void Attach(Observer observer) {

        observers.add(observer);

    }

    

    public void Detach(Observer observer) {

        observers.remove(observer);

    }

}

Observer : 观察者类,定义更新接口 (Update),当收到 Subject 的通知时,Observer 需要同步更新信息。

abstract class Observer {

    protected String name;

    protected Subject subject;

    public Observer(String name, Subject subject) {

        this.name = name;

        this.subject = subject;

    }

    public abstract void Update();

}

ConcreteSubject : 具体主题类,存储对于这个主题感兴趣的所有观察者。当内部状态发生变化时,应通知所有登记的观察者 (Notify)

class ConcreteSubject extends Subject {

    public ConcreteSubject(String name) {

        super(name);

    }

    @Override

    public String getState() {

        return state;

    }

    @Override

    public void setState(String state) {

        this.state = state;

    }

    

    @Override

    public void Notify() {

        System.out.println("======= " + this.name + "主题发布新消息 =======");

        for (Observer observer : observers) {

            observer.Update();

        }

    }

}

ConcreteObserver : 具体观察者类,实现 Observer 的更新接口 (Update),以便和 Subject 同步状态信息。

class ConcreteObserver extends Observer {

    private String state;

    public ConcreteObserver(String name, Subject subject) {

        super(name, subject);

    }

    @Override

    public void Update() {

        state = subject.getState();

        System.out.println(this.name + "收到当前状态:" + state);

    }

}

测试代码





public class ObserverPattern {

    public static void main(String[] args) {

        ConcreteSubject subject = new ConcreteSubject("天气");    

        ConcreteObserver observer1 = new ConcreteObserver("张三", subject);

        ConcreteObserver observer2 = new ConcreteObserver("李四", subject);

        ConcreteObserver observer3 = new ConcreteObserver("王五", subject);

        

        subject.Attach(observer1);

        subject.Attach(observer2);

        subject.Attach(observer3);    

        subject.setState("今天下雨");

        subject.Notify();

        

        subject.Detach(observer2);

        subject.setState("明天天晴");

        subject.Notify();

    }

}

View Code
运行结果





======= 天气主题发布新消息 =======

张三收到当前状态:今天下雨

李四收到当前状态:今天下雨

王五收到当前状态:今天下雨

======= 天气主题发布新消息 =======

张三收到当前状态:明天天晴

王五收到当前状态:明天天晴

View Code

 

[b]推荐[/b]
本文属于 JAVA设计模式系列

[b]参考资料[/b]
《大话设计模式》

《HeadFirst设计模式》
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: