本文主要用作学习记录,参考headfirst设计模式
设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承
设计原则:找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
//定义主题
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
//定义观察者
public interface Observer {
public void update(float temp,float humidity,float pressure);
}
//实现主题
public class WeatherData implements Subject{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
observers = new ArrayList();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = observers.indexOf(observer);
if(i>=0){
observers.remove(observer);
}
}
@Override
public void notifyObservers() {
for(int i=0;i<observers.size();i++){
Observer observer = (Observer) observers.get(i);
observer.update(temperature,humidity,pressure);
}
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
//实现订阅1
public class CurrentConditionsDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.println("CurrentConditionsDisplay: "+ temperature + "--"+humidity);
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display();
}
}
//实现订阅2
public class CurrentConditionsDisplay1 implements Observer,DisplayElement{
private float temperature;
private float humidity;
private float pressure;
private Subject weatherData;
public CurrentConditionsDisplay1(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.println("CurrentConditionsDisplay1: "+ temperature + "--"+humidity +"--"+pressure);
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
this.pressure = pressure;
display();
}
}
//测试
public class Test {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
CurrentConditionsDisplay1 currentConditionsDisplay1 = new CurrentConditionsDisplay1(weatherData);
weatherData.setMeasurements(1.2f,8.9f,10.2f);
}
}
JDK 中观察者模式测试
public class ObserverTest implements java.util.Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg);
}
}
public class ObserverTest1 extends Observable {
@Override
public void notifyObservers(Object arg) {
super.notifyObservers(arg);
}
public static void main(String[] args) {
ObserverTest observerTest = new ObserverTest();
ObserverTest1 observerTest1 = new ObserverTest1();
observerTest1.addObserver(observerTest);
observerTest1.setChanged();
observerTest1.notifyObservers("1232");
}
}