设计模式之观察者模式
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
核心原理:
1.被观察者中维护一个观察者对象列表
2.观察者可新增可可移除。
需要角色:
1.抽象观察者
2.抽象被观察者
3.具体观察者
4.具体被观察者
关系如下:
实施步骤:
抽象被观察者:
public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObserver();}
抽象观察者:
public interface Observer {public void update(String message);}
具体被观察者
public class WechatServer implements Subject {private List<Observer> list;private String message;public WechatServer() {list = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o) {list.add(o);}@Overridepublic void removeObserver(Observer o) {if (!list.isEmpty()) {list.remove(o);}}@Overridepublic void notifyObserver() {for (Observer o : list) {o.update(message);}}public void setInfomation(String s) {this.message = s;System.out.println("被观察者更新消息: " + s);// 消息更新,通知所有观察者notifyObserver();}}
具体观察者
public class User implements Observer {private String name;private String message;public User(String name) {this.name = name;}@Overridepublic void update(String message) {this.message = message;read();}public void read() {System.out.println(name + " 收到推送消息: " + message);}}
演示:
public class MainTest {public static void main(String[] args) {WechatServer server = new WechatServer();Observer userZhang = new User("ZhangSan");Observer userLi = new User("LiSi");Observer userWang = new User("WangWu");server.registerObserver(userZhang);server.registerObserver(userLi);server.registerObserver(userWang);server.setInfomation(" 我第一次变化了!");System.out.println("----------------------------------------------");server.removeObserver(userZhang);server.setInfomation("我第二次变化了!");}}