设计模式观察者模式(ObserverPatern)
2018-01-04 11:31
316 查看
核心模块:抽象观察者,具体观察者,抽象主题,具体主题
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
使用场景:一个对象的改变将导致一个或多个其他对象也发生改变,适合一对一或者一对多的场景;
优点:主题和观察者之间松耦合(观察者并不需要知道主题发生了什么变化),符合opc原则(新增观察者只需要实现抽象观察者),支持广播(一对多);
缺点:如果观察者较多,抽象主题通知和遍历将会花费很多时间,如果观察者和主题之间有循环依赖,可能造成循环依赖;
注意:
1,多个观察者时,不可以依赖特定的通知次序,特定的通知次序请使用职责链模式;
内容打印
Hello World!
手机收到消息:今天多云
电脑收到消息:今天多云 成都 200 相对湿度80%
手机收到消息:明天下雨
电脑收到消息:明天下雨 成都 200 相对湿度80%
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
使用场景:一个对象的改变将导致一个或多个其他对象也发生改变,适合一对一或者一对多的场景;
优点:主题和观察者之间松耦合(观察者并不需要知道主题发生了什么变化),符合opc原则(新增观察者只需要实现抽象观察者),支持广播(一对多);
缺点:如果观察者较多,抽象主题通知和遍历将会花费很多时间,如果观察者和主题之间有循环依赖,可能造成循环依赖;
注意:
1,多个观察者时,不可以依赖特定的通知次序,特定的通知次序请使用职责链模式;
/** * Created by tory on 2018/1/3. * 观察者模式 * 使用场景:一个对象发生改变时将自动通知其他对象 */ public class ObserverPatern { public static void main(String[] args) { WeatherSubject weather = new WeatherSubject(); weather.register(new PhoneObserver()); weather.register(new ComputerObserver()); weather.publish("今天多云"); weather.publish("明天下雨"); } } //Subject 抽象主题,Obervable 被观察者/被订阅者 abstract class Subject { protected String message; private List<Observer> list; public Subject() { list = new ArrayList<>(8); } //订阅subscribe public void register(Observer observer) { list.add(observer); } //取消订阅 public void delete(Observer observer) { list.remove(observer); } //发布内容 public void publish(String message) { this.message = message; for (Observer observer : list) { observer.update(this, message); } } } //Observer 抽象观察者, interface Observer { public void update(Subject all, String message); } //ConcreteSubject具体被观察者,被订阅的主题 class WeatherSubject extends Subject { String city; String wind; String quality; String humidity; WeatherSubject() { city = "成都"; wind = "3级"; quality = "200"; humidity = "相对湿度80%"; } } //ContreObserver 具体订阅者 class PhoneObserver implements Observer { //手机订阅天气 @Override public void update(Subject all, String message) { System.out.println("手机收到消息:" + message); } } //ContreObserver 具体订阅者 class ComputerObserver implements Observer { //电脑订阅天气 @Override public void update(Subject all, String message) { if (all instanceof WeatherSubject) { WeatherSubject weather = (WeatherSubject) all; System.out .println("电脑收到消息:" + weather.message + " " + weather.city + " " + weather.quality + " " + weather .humidity); } else { System.out.println("电脑收到消息:" + message); } } }
内容打印
Hello World!
手机收到消息:今天多云
电脑收到消息:今天多云 成都 200 相对湿度80%
手机收到消息:明天下雨
电脑收到消息:明天下雨 成都 200 相对湿度80%
相关文章推荐
- 设计模式随笔系列:气象站的故事-观察者模式(Observer)[原]
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 设计模式之观察者模式Observer
- 每天一个设计模式: 观察者模式(Observer)
- Java设计模式——观察者模式(Observer Pattern)
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
- C#设计模式之十六观察者模式(Observer Pattern)【行为型】
- 观察者设计模式( Observable类Observer接口)
- C#设计模式之十六观察者模式(Observer Pattern)【行为型】
- 设计模式学习笔记--观察者(Observer)模式
- 设计模式之Observer 观察者
- 设计模式笔记——(三:观察者模式 Observer Pattern)
- 浅谈 java 设计模式--观察者模式(Observer pattern)
- C#设计模式之Observer设计模式(观察者设计模式)
- 二十四种设计模式:观察者模式(Observer Pattern)
- 设计模式之观察者模式(Observer模式)
- C#设计模式——观察者模式(Observer Pattern)
- 设计模式之观察者模式(Observer pattern)
- Head First--设计模式(观察者模式Observer)
- 设计模式之 Observer Pattern 观察者模式