设计模式之观察者模式
原博文链接:https://www.cnblogs.com/porotin/p/7825656.html
观察者模式定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。可以理解为发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
场景及实现:微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。
1. 定义一个观察者接口
public interface Observer { /** * 观察者收到公众号更新的内容 * @param message */ void update(String message); }
2. 实现观察者接口
public class User implements Observer { private String name; public User(String name) { this.name = name; } @Override public void update(String message) { System.out.println(this.name + "收到了消息:" + message); } }
3. 定义一个抽象被观察者接口,本例中被观察者就是微信公众号。
public interface ObserverServer { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver(String message); }
4. 实现被观察者接口
public class WeChatServer implements ObserverServer { private String message; private List<Observer> observers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { if (observers.size() > 0) { observers.remove(observer); } } @Override public void notifyObserver(String message) { for (Observer observer : observers) { observer.update(message); } }
5. 开始测试,首先创建三个人john, lucy, lily订阅公众号,公众号发布消息"PHP是世界上最好的语言",大家都可以收到消息。 john作为一个java程序员,收到消息后,立马取关。
public class MainTest { public static void main(String[] args) { WeChatServer server = new WeChatServer(); User john = new User("john"); User lucy = new User("lucy"); User lily = new User("lily"); server.registerObserver(john); server.registerObserver(lucy); server.registerObserver(lily); System.out.println("开始推送消息"); server.notifyObserver("PHP是世界上最好的语言"); server.removeObserver(john); System.out.println("-------------john取关"); System.out.println("开始推送消息"); server.notifyObserver("PHP是世界上最好的语言"); } }
打印结果
开始推送消息 john收到了消息:PHP是世界上最好的语言 lucy收到了消息:PHP是世界上最好的语言 lily收到了消息:PHP是世界上最好的语言 -------------john取关 开始推送消息 lucy收到了消息:PHP是世界上最好的语言 lily收到了消息:PHP是世界上最好的语言
浙公网安备 33010602011771号