设计模式——观察者模式

来源:互联网 发布:热血江湖人工智能披风 编辑:程序博客网 时间:2024/06/05 02:43

个人理解:

1. 观察者模式属于行为模式

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

3. 观察者模式UML图:


4. 成员说明

Observer:抽象观察者(抽象订阅者),为具体观察者定义update方法,在Subject通知后更新自己,可为接口或抽象类

ConcreteObserver:具体观察者(具体订阅者),对抽象观察者定义的update方法进行具体实现

Subject:抽象被观察者(抽象通知者,抽象主题),定义了增加、删除Observer及通知Observer的方法,可为接口或者抽象类

ConcreteSubject:具体被观察者(具体通知者,具体主题),具有观察者Observer列表或者集合以存储本主题的观察者(订阅者),实现了抽象Subject的增加、删除及通知方法

5. 示例代码:

Observer:

public interface Observer {    void update(String string);}

ConcreteObserver:

public class NewsReader implements Observer {    private String name;    public NewsReader(String name) {        this.name = name;    }    @Override    public void update(String string) {        Log.i("NewsReader", "------" + name + "获取到信息:" + string + "------");    }}
Subject:

public interface Subject {    void attach(Observer observer);    void detach(Observer observer);    void notify(String message);}

ConcreteSubject

public class NewsPublisher implements Subject {    List<Observer> observerList = new ArrayList<>();    @Override    public void attach(Observer observer) {        if (!observerList.contains(observer)){            observerList.add(observer);        }    }    @Override    public void detach(Observer observer) {        if (observerList.contains(observer)){            observerList.remove(observer);        }    }    @Override    public void notify(String message) {        for (Observer observer : observerList){            observer.update(message);        }    }}

客户端调用:

private void factoryObserver(){    Subject newsPublisher = new NewsPublisher();    Observer reader1 = new NewsReader("德玛西亚");    Observer reader2 = new NewsReader("艾希");    Observer reader3 = new NewsReader("拉克丝");    Observer reader4 = new NewsReader("赵信");    Observer reader5 = new NewsReader("李青");    newsPublisher.attach(reader1);    newsPublisher.attach(reader2);    newsPublisher.attach(reader3);    newsPublisher.attach(reader4);    newsPublisher.attach(reader5);    newsPublisher.notify("LOL今晚5黑开始");}

运行结果:

12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------德玛西亚获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------艾希获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------拉克丝获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------赵信获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------李青获取到信息:LOL今晚5黑开始------