观察者模式

xiaoxiao2021-02-28  39

观察着模式(又被称为发布-订阅(Publish/Subscribe)模式,多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

主题或者抽象通知者,抽象被观察者

public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); }

抽象观察者

public interface Observer { void update(String message); }

具体被观察者

public class ConcreteSubject implements Subject { private List<Observer> list; private String message; ConcreteSubject(){ list = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { list.add(o); } @Override public void removeObserver(Observer o) { if(!list.isEmpty()) list.remove(o); } @Override public void notifyObserver() { for(int i = 0; i < list.size(); i++) { Observer oserver = list.get(i); oserver.update(message); } } public void setInfomation(String s) { this.message = s; System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者 notifyObserver(); } } 具体的观察者 public class ConcreteObserver implements Observer { private String name; private String message; public ConcreteObserver(String name) { this.name = name; } @Override public void update(String message) { this.message = message; read(); } public void read() { System.out.println(name + " 收到推送消息: " + message); } } 测试类 public class TestPublish_Subscribe { public static void main(String args[]){ ConcreteSubject subject = new ConcreteSubject(); Observer user1 = new ConcreteObserver("具体观察者1"); Observer user2 = new ConcreteObserver("具体观察者2"); Observer user3 = new ConcreteObserver("具体观察者3"); subject.registerObserver(user1); subject.registerObserver(user2); subject.registerObserver(user3); subject.setInfomation("这是给具体观察者推送的消息!"); System.out.println("----------------------------------------------"); subject.removeObserver(user1);//将具体观察者1从推送列表中删除 subject.setInfomation("再次推送消息!"); } }

这是结尾。。。

转载请注明原文地址: https://www.6miu.com/read-2631430.html

最新回复(0)