观察者模式:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
设计原则:
1.为交互对象之间的松耦合设计
注意:java本身自带了这种模式的接口。
具体实现如下:
/** *主题接口 */ public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
/** * 观察者接口 */ public interface Observer { void update(String params); }
/** * 具体主题的实现 */ public class WeatherData implements Subject { private List<Observer> observers; private String params; //需要发布的数据 public WeatherData() { this.observers = new ArrayList<Observer>(); } @Override public void registerObserver(Observer observer) { if (observer != null) { this.observers.add(observer); } } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index > 0) { observers.remove(index); } } /** * 通过此方法将数据发布给各订阅者 * */ @Override public void notifyObservers() { for(Observer observer: observers){ observer.update(params); } } /** * 需要发布的数据状态有改变 * */ public void setChange(){ notifyObservers(); } public String getParams() { return params; } public void setParams(String params) { this.params = params; setChange(); } }
/** * 观察者实现 */ public class CustomerObserver implements Observer { private String params; //订阅的数据 private Subject subject; public CustomerObserver(Subject subject) { this.subject = subject; this.subject.registerObserver(this); //此处维护订阅的关系 } @Override public void update(String params) { this.params = params; System.out.println("display params:" + params); } }
/** * 测试类 */ public class TestObserver { public static void main(String[] args) { WeatherData subject = new WeatherData(); Observer observer1 = new CustomerObserver(subject); Observer observer2 = new CustomerObserver(subject); subject.setParams("data1"); subject.setParams("data2"); } }
通过java 自身的接口实现观察者模式
import java.util.Observable; /** *继承java的类,不需要实现注册,和取消注册等方法,已经实现 */ public class WeatherData extends Observable { private String params; //需要发布的数据 public void statuChange(){ setChanged(); //注意此方法一定要调用,改变发布数据的状态 // notifyObservers(); //java自身实现 notifyObservers(new String("这个方法,将此对象发布到观察者对象中")); } public String getParams() { return params; } public void setParams(String params) { this.params = params; statuChange(); //状态改变 } @Override public String toString() { return "WeatherData{" + "params='" + params + '\'' + '}'; } }
import java.util.Observable; import java.util.Observer; /** * 观察者 */ public class CustomerObserver implements Observer { private Observable observable; public CustomerObserver(Observable observable) { this.observable = observable; this.observable.addObserver(this); } @Override public void update(Observable o, Object arg) { if(o instanceof WeatherData){ //此处获取发布的数据 System.out.println(o); } if(arg!=null){ //这个对象是发布方法传过来的 System.out.println("--------------" +arg); } } }
/** * Created by Administrator on 2017/11/18. */ public class TestJavaObserver { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CustomerObserver customerObserver = new CustomerObserver(weatherData); weatherData.setParams("参数"); } }