观察者模式

一、定义

 观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。 

在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。

观察者模式又称为发布-订阅模式。

二、组成

在观察者设计模式中,一般有四个角色:、

Subject:目标。他把所有对观察者对戏的引用保存在一个聚集里,每一个主题都可以有多个观察者。

Observer:观察者。为所有的具体观察者定义一个接口,在得到主题的通知时能够及时的更新自己。

ConcreteSubject:具体主题。将有关状态存入具体观察者对象。在具体主题发生改变时,给所有的观察者发出通知。

ConcreteObserver:具体观察者。实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调。

三、实现

/**
 * 此类不属于观察者模式必须的类,用来存放事件的信息
 *
 * @Author: chenqi
 * @Date: 2019.9.23 09:51
 */
public class News {
    private String title;
    private String content;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

创建抽象被观察者

/**
 * 抽象主题角色
 *
 * @Author: chenqi
 * @Date: 2019.9.23 09:52
 */
public interface Subject {
//    List<People> peopleList = new ArrayList<>();
//
//   default void add(People people) {
//        peopleList.add(people);
//    }
//   default void remove(People  people){
//        peopleList.remove(people);
//    }
//    void update();

    void add(People people);

    void remove(People people);

    void update();
}

创建被观察者的实现

/**
 * 具体主题角色
 *
 * @Author: chenqi
 * @Date: 2019.9.23 10:10
 */
public class NewsSubject implements Subject {

    List<People> peopleList = new ArrayList<>();


    @Override
    public void add(People people) {
        peopleList.add(people);
    }

    @Override
    public void remove(People people) {
        peopleList.remove(people);
    }

    @Override
    public void update() {
        for (People people : peopleList) {
            News news = new News();
            news.setContent("news news news");
            news.setTitle("title title title");
            people.update(news);
        }
    }

}

创建抽象观察者和实现

/**
 * 抽象观察者角色
 *
 * @Author: chenqi
 * @Date: 2019.9.23 09:52
 */
public interface People {
    void update(News news);
}


/**
 * 具体观察者角色
 *
 * @Author: chenqi
 * @Date: 2019.9.23 10:10
 */
public class PeopleA implements People {
    @Override
    public void update(News news) {
        System.out.println("这个新闻真好看");
    }
}
// PeopleB,PeopleC

测试

public class Test {
    public static void main(String[] args) {
        Subject subject = new NewsSubject();
        subject.add(new PeopleA());
        subject.add(new PeopleB());
        subject.add(new PeopleC());
        subject.update();
    }
}
Last modification:October 24th, 2019 at 01:57 pm