标签:
HeadFirst中对观察者模式的定义:观察者模式定义了对象之间的一对多的依赖,这样一来,当一个状态发生变化时,它的所有依赖者都会收到通知并自动更新。
松耦合:当两个对象时间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式提供了一种对象设计,让主题和观察者之间的松耦合。
有两种自动更细的方式,主题推送给每个观察者或者观察者从主题中拉取。
Java中内置了观察者模式,可以很方便的写出代码。
自己写了两个Demo,一个是自己实现,一个是借助Java中的实现。
Demo1:
package com.wxisme.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 主题接口
* @author wxisme
*
*/
public interface Subject {
List<Observer> observerList = new ArrayList<>();
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
package com.wxisme.observer;
/**
* 观察者接口
* @author wxisme
*/
public interface Observer {
void update(Subject subject);
}
package com.wxisme.observer;
/**
* 具体的主题对象,实现主题接口
* @author wxisme
*
*/
public class ConcreteSubject implements Subject {
private int state;
@Override
public void registerObserver(Observer observer) {
ConcreteSubject.observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
ConcreteSubject.observerList.remove(observer);
}
@Override
public void notifyObserver() {
for(int i=0; i<ConcreteSubject.observerList.size(); i++) {
ConcreteSubject.observerList.get(i).update(this);
}
}
public void changed() {
this.notifyObserver();
}
public int getState() {
return state;
}
//当具体的主题对象的状态改变时,会调用notify()方法,通知每个在此主题注册了的观察者。
public void setState(int state) {
this.state = state;
this.changed();
}
}
package com.wxisme.observer;
/**
* 具体的观察者,实现观察者接口。
* @author wxisme
*
*/
public class ConcreteObserver implements Observer {
private int myState;
@Override
public void update(Subject subject) {
setMyState(((ConcreteSubject)subject).getState());
System.out.println("myState changed:" + myState);
}
public int getMyState() {
return myState;
}
public void setMyState(int myState) {
this.myState = myState;
}
}
package com.wxisme.observer;
/**
* 测试观察者模式
* @author wxisme
*/
public class Demo {
public static void main(String[] args) {
//一个主题对应多个观察者
ConcreteSubject csbj = new ConcreteSubject();
ConcreteObserver cobs1 = new ConcreteObserver();
csbj.registerObserver(cobs1);
ConcreteObserver cobs2 = new ConcreteObserver();
csbj.registerObserver(cobs2);
ConcreteObserver cobs3 = new ConcreteObserver();
csbj.registerObserver(cobs3);
//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。
csbj.setState(20);
System.out.println("------------------");
csbj.setState(400);
}
}
运行结果:
myState changed:20
myState changed:20
myState changed:20
------------------
myState changed:400
myState changed:400
myState changed:400
package com.wxisme.javaobserver;
import java.util.Observable;
public class ConcreteSubject extends Observable {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
setChanged();
notifyObservers(state);
}
}
package com.wxisme.javaobserver;
import java.util.Observable;
import java.util.Observer;
public class ConcreteObserver implements Observer {
private int myState;
@Override
public void update(Observable obs, Object obj) {
setMyState(((ConcreteSubject)obs).getState());
System.out.println("myState changed:" + myState);
}
public void setMyState(int myState) {
this.myState = myState;
}
public int getMyState() {
return myState;
}
}
package com.wxisme.observer;
/**
* 测试观察者模式
* @author wxisme
*/
public class Demo {
public static void main(String[] args) {
//一个主题对应多个观察者
ConcreteSubject csbj = new ConcreteSubject();
ConcreteObserver cobs1 = new ConcreteObserver();
csbj.registerObserver(cobs1);
ConcreteObserver cobs2 = new ConcreteObserver();
csbj.registerObserver(cobs2);
ConcreteObserver cobs3 = new ConcreteObserver();
csbj.registerObserver(cobs3);
//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。
csbj.setState(20);
System.out.println("------------------");
csbj.setState(400);
}
}
运行结果:
myState changed:20
myState changed:20
myState changed:20
------------------
myState changed:400
myState changed:400
myState changed:400
标签:
原文地址:http://www.cnblogs.com/wxisme/p/4499147.html