概述
观察者模式是把两个对象分为被观察者与观察者,它们是一对多的关系,当被观察者状态改变时,所有的观察者都能收到通知。类似于微信公众号,可以把文章推送到关注了这个公众号的用户。
举例
在Java Swing中,如JButton的监听器,button.addListenner(new XXXListenner());单击、双击、长按监听器…
类图
Official:公众号接口(被观察对象)
User:用户接口(观察者)
设计时可以在UserImpl里面关联上Official,这样的话就可以在创建 UserImpl的时候直接关联上“被观察者”,
Official official = new Official();
UserImpl a = new UserImpl(official); //直接绑定,我下面的代码没有这样做
代码
//公众号接口
public interface Official {
public void addUser(User user);
public void remove(User user);
public void push();
}
//用户接口
public interface User {
public void receive(String news,String book,String paper);
public void display();
}
//公众号实例
public class OfficialImpl implements Official {
List<User> list; //公众号与用户是一对多关系,
private String news;
private String book;
private String paper;
public OfficialImpl() {
list = new ArrayList<>();
}
@Override
public void addUser(User user) {
list.add(user);
}
@Override
public void remove(User user) {
list.remove(user);
}
@Override
public void push() {
for(User user : list) {
user.receive(news, book, paper);
}
}
public void setNews(String news) {
this.news = news;
}
public void setBook(String book) {
this.book = book;
}
public void setPaper(String paper) {
this.paper = paper;
}
}
//用户实例
public class UserImpl1 implements User {
private String name;
private String news;
private String book;
private String paper;
public UserImpl1(String name) {
this.name = name;
}
@Override
public void receive(String news, String book, String paper) {
this.news = news;
this.book = book;
this.paper = paper;
display();
}
@Override
public void display() {
System.out.println(name + ":" + news + "|"+ book + "|" + paper);
}
}
//main方法
public static void main(String[] args) {
//公众号实例
OfficialImpl official = new OfficialImpl();
//添加n个用户
official.addUser(new UserImpl1("小明"));
official.addUser(new UserImpl1("小红"));
official.addUser(new UserImpl1("小新"));
//UserImpl2类我没写,代码和UserImpl1差不多只需实现User接口
official.setNews("外星人来袭");
official.setBook("<<故事会>>");
official.setPaper("论减肥重要性");
official.push();
}
输出结果:
总结
观察者模式是面向接口编程,动态增加新的“观察者”,以后需要UserImpl3、UserImpl4…时,只需要实现User接口,覆写接口的公用方法就可以直接使用。另外,可以在“被观察者”中加入get方法,用户可以“单独”获得最新状态。
Java 有内置工具,Observable抽象类(被观察者)和Observer接口(观察者),开发者可以直接实现来使用观察者模式更省事,有 需要的可以去了解下