这几天在看ssh整合的一些具体注意事项合乱码问题,设计模式也没来得及看了,号不容易有点空闲时间,看了看观察者模式:
观察者模式:定义了对象之间的一对多依赖,这样一来,当对象改变状态时,它的所有依赖者都会收到通知并自动更新.
还学到了一个新的设计原则:松耦合设计。
下面看代码:
1.定义主题接口
public interface Subject {
public void rigisterObserver(Observer o);//注册观察者
public void removeObserver(Observer o);//取消观察观察者
public void notifyOberver();
}
2.定义观察者接口。
public interface Observer {
public void update(double tem, double hum, double pre);
}
3.定义观察者另外实现的接口。
public interface DisplayElement {
public void display();
}
4.定义主题。
import java.util.ArrayList;
public class WeatherData implements Subject {
private double tem;// 但前温度
private double hum;// 但前湿度
private double pre;// 但前气压
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public void measureChanged() {
this.notifyOberver();
}
/**
* 模拟气象装置
*/
public void setMeasurement(double tem, double hum, double pre) {
this.tem = tem;
this.hum = hum;
this.pre = pre;
measureChanged();
}
public void notifyOberver() {
for (Observer o : observers) {
o.update(tem, hum, pre);
}
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void rigisterObserver(Observer o) {
observers.add(o);
}
}
5.定义观察者。
public class CurrentConditionsDisplay implements Observer, DisplayElement {
@SuppressWarnings("unused")
private Subject weatherData;
private double tem;
private double hum;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.rigisterObserver(this);// 注册
}
public void update(double tem, double hum, double pre) {
this.tem = tem;
this.hum = hum;
display();
}
public void display() {
System.out.println("当前温度:" + this.tem + "当前湿度:" + this.hum);
}
}
6.测试。
public class Test {
public static void main(String[] args) {
Subject weatherData = new WeatherData();
@SuppressWarnings("unused")
Observer currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
((WeatherData) weatherData).setMeasurement(10,10,10);
}
}
以上代码参考《headfirst 设计模式》
观察者模式:定义了对象之间的一对多依赖,这样一来,当对象改变状态时,它的所有依赖者都会收到通知并自动更新.
还学到了一个新的设计原则:松耦合设计。
下面看代码:
1.定义主题接口
public interface Subject {
public void rigisterObserver(Observer o);//注册观察者
public void removeObserver(Observer o);//取消观察观察者
public void notifyOberver();
}
2.定义观察者接口。
public interface Observer {
public void update(double tem, double hum, double pre);
}
3.定义观察者另外实现的接口。
public interface DisplayElement {
public void display();
}
4.定义主题。
import java.util.ArrayList;
public class WeatherData implements Subject {
private double tem;// 但前温度
private double hum;// 但前湿度
private double pre;// 但前气压
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public void measureChanged() {
this.notifyOberver();
}
/**
* 模拟气象装置
*/
public void setMeasurement(double tem, double hum, double pre) {
this.tem = tem;
this.hum = hum;
this.pre = pre;
measureChanged();
}
public void notifyOberver() {
for (Observer o : observers) {
o.update(tem, hum, pre);
}
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void rigisterObserver(Observer o) {
observers.add(o);
}
}
5.定义观察者。
public class CurrentConditionsDisplay implements Observer, DisplayElement {
@SuppressWarnings("unused")
private Subject weatherData;
private double tem;
private double hum;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.rigisterObserver(this);// 注册
}
public void update(double tem, double hum, double pre) {
this.tem = tem;
this.hum = hum;
display();
}
public void display() {
System.out.println("当前温度:" + this.tem + "当前湿度:" + this.hum);
}
}
6.测试。
public class Test {
public static void main(String[] args) {
Subject weatherData = new WeatherData();
@SuppressWarnings("unused")
Observer currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
((WeatherData) weatherData).setMeasurement(10,10,10);
}
}
以上代码参考《headfirst 设计模式》