观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。
观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。
现在我们举一个类似的情况,并使用代码来实现,为大家提供一个比较明显的认识。
大家都用过交流平台工具,如微信、qq,那么肯定知道"特别关心"这个功能,当你将谁设置为特别关心的时候,那个人一但发表朋友圈,系统就会立刻通知你,你的特别关心好友发表了一遍文章。。。假设小新的爸爸妈妈将小新设为了特别关心,用观察者模式改如何实现呢?那么我们就来实现下吧。
1、//观察者
//观察者 public class PersonObserver implements Observer { private String name; public PersonObserver(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { Circle circle = (Circle)o; Infomation args = (Infomation)arg; System.out.println(name+"接收到一个"+args.getName()+"发表的一个"+circle.getName()+"的朋友圈--"+args.getContext()); } }
2、被观察者信息
public class Infomation { private String name; private String context; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContext() { return context; } public void setContext(String context) { this.context = context; } }
3、被观察者
public class Circle extends Observable { private String name; public Circle(String name) { this.name = name; } public String getName() { return name; } public void produceInfo(Circle circle,Infomation infomation){ System.out.println(infomation.getName()+"发表了一个关于"+circle.getName()+"的朋友圈---"+infomation.getContext()); setChanged(); notifyObservers(infomation); } }
4、测试代码
public class Test { public static void main(String[] args) { Circle circle = new Circle("新年"); PersonObserver persion = new PersonObserver("小新爸爸"); circle.addObserver(persion); PersonObserver persion2 = new PersonObserver("小新妈妈"); circle.addObserver(persion2); Infomation infomation = new Infomation(); infomation.setName("小新"); infomation.setContext("今天是个好日子"); circle.produceInfo(circle,infomation); } }
运行结果为: