碌碌无为的做了五年Java程序员,总是参考别人的代码,也该做点贡献了。代码大多参考网上书上的例子,谈谈个人对设计模式的理解。代码纯手敲,eclipse上运行通过。水平有限,请各位多多批评指正。
以观察者模式开启设计模式之路。
基本思想:
观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除
出现率最高的天气预报例子:
代码
import java.util.ArrayList;
interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
class Whether implements Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
private float temperature;
@Override
public void notifyObservers() {
for (int i = 0; i < this.observers.size(); i++) {
this.observers.get(i).update(temperature);
}
}
@Override
public void registerObserver(Observer o) {
this.observers.add(o);
}
@Override
public void removeObserver(Observer o) {
this.observers.remove(o);
}
public void whetherChange() {
this.notifyObservers();
}
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
}
interface Observer {
public void update(float temp);
}
class WhetherDisplay1 implements Observer {
private float temperature;
public WhetherDisplay1(Subject whether) {
whether.registerObserver(this);
}
@Override
public void update(float temp) {
this.temperature = temp;
display();
}
public void display() {
System.out.println("display1****:" + this.temperature);
}
}
class WhetherDisplay2 implements Observer {
private float temperature;
public WhetherDisplay2(Subject whether) {
whether.registerObserver(this);
}
@Override
public void update(float temp) {
this.temperature = temp;
display();
}
public void display() {
System.out.println("display2****:" + this.temperature);
}
}
public class Test {
public static void main(String[] args) {
Whether whether = new Whether();
WhetherDisplay1 d1 = new WhetherDisplay1(whether);
WhetherDisplay2 d2 = new WhetherDisplay2(whether);
whether.setTemperature(27);
whether.setTemperature(26);
whether.removeObserver(d1);
whether.setTemperature(30);
whether.registerObserver(d1);
whether.setTemperature(38);
}
}
以上代码实现了简单的实现观察者模式的思想