观察者模式定义:
观察者模式又被称为发布-订阅模式,在对象之间定义一对多的关系,这样在一个对象改变状态,依赖它的对象就会收到通知。
观察者模式一般用于实现订阅功能的场景,例如公众号订阅、微博订阅、抖音关注;当我们订阅的人发布了新动态,我们就会收到。
代码演示:
package com.lzw.observer;
/**
* 抽象被观察者接口
* 含有增加、删除、通知观察者的方法
* @author Administrator
* @version 创建时间:2019年5月26日 下午3:29:52
*/
public interface Observerable {
public void registerObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObserver();
}
package com.lzw.observer;
/**
* 抽象观察者接口
* update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
* @author Administrator
* @version 创建时间:2019年5月26日 下午3:33:51
*/
public interface Observer {
public void updateMessage(String message);
}
package com.lzw.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者
* 实现了Observerable接口,具体实现三个方法
* @author Administrator
* @version 创建时间:2019年5月26日 下午3:41:19
*/
public class ObservedServer implements Observerable {
private List<Observer> list;
private String message;
public ObservedServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
list.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObserver() {
for(int i = 0; i < list.size(); i++) {
Observer oserver = list.get(i);
oserver.updateMessage(message);
}
}
public void setInfomation(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
package com.lzw.observer;
/**
* 观察者
* @author Administrator
* @version 创建时间:2019年5月26日 下午3:47:52
*/
public class User implements Observer{
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void updateMessage(String message) {
this.message = message;
read();
}
public void read() {
System.out.println(name + " 收到推送消息: " + message);
}
}
测试类
package com.lzw.observer;
public class Test {
public static void main(String[] args) {
ObservedServer server = new ObservedServer();
Observer observer1 = new User("张三");
Observer observer2 = new User("李四");
Observer observer3 = new User("王五");
server.registerObserver(observer1);
server.registerObserver(observer2);
server.registerObserver(observer3);
server.setInfomation("Java是世界上最好的语言。不接受任何反驳!");
System.out.println("-------------------------");
server.deleteObserver(observer1);
server.setInfomation("Python是世界上最好用的语言!");
}
}
打印结果:
服务端更新消息: Java是世界上最好的语言。不接受任何反驳! 张三 收到推送消息: Java是世界上最好的语言。不接受任何反驳! 李四 收到推送消息: Java是世界上最好的语言。不接受任何反驳! 王五 收到推送消息: Java是世界上最好的语言。不接受任何反驳! ------------------------- 服务端更新消息: Python是世界上最好用的语言! 李四 收到推送消息: Python是世界上最好用的语言! 王五 收到推送消息: Python是世界上最好用的语言!
其他模式:
工厂模式
单例模式