本文共 2515 字,大约阅读时间需要 8 分钟。
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。
在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
观察者模式的主要角色如下。
定义抽象主题:
package com.siyi.observerpattern;import java.util.ArrayList;import java.util.List;//抽象目标public abstract class Subject { protected Listobservers = new ArrayList (); //增加观察者方法 public void add(Observer observer) { observers.add(observer); } //删除观察者方法 public void remove(Observer observer) { observers.remove(observer); } public abstract void notifyObserver(); //通知观察者方法}
定义具体主题:
package com.siyi.observerpattern;public class ConcreteSubject extends Subject { public void notifyObserver() { System.out.println("具体目标发生改变..."); for (Observer obs : observers) { obs.update(); } }}
定义抽象观察者:
package com.siyi.observerpattern;//抽象观察者public interface Observer { void update(); //修改}
定义具体观察者:
package com.siyi.observerpattern;//具体观察者1public class ConcreteObserver1 implements Observer { @Override public void update() { System.out.println("具体观察者1作出修改!"); }}---------------------------------------------------------package com.siyi.observerpattern;//具体观察者2public class ConcreteObserver2 implements Observer { @Override public void update() { System.out.println("具体观察者2作出修改!"); }}
主方法:
package com.siyi.observerpattern;public class Main { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer obs1 = new ConcreteObserver1(); Observer obs2 = new ConcreteObserver2(); subject.add(obs1); subject.add(obs2); subject.notifyObserver(); }}
运行结果:
具体目标发生改变...具体观察者1作出修改!具体观察者2作出修改!
优点:
缺点:
转载地址:http://aryof.baihongyu.com/