Java设计模式 --- 观察者模式

2017-01-13 15:04:03来源:csdn作者:Google_huchun人点击

观察者模式分为推模型和拉模型。

观察者模式主要有4中角色:

1 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)中,每个主题都可以有任意数量的观察者,抽象主题里提供接口,增加和删除观察者,通知观察者。

2 具体主题(ConcreteSubject)角色:将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者

3 抽象观察者(Observer)角色:为所有的观察者定义一个更新接口

4 具体观察者(ConcreteObserver)角色:实现抽象观察者所定义的更新接口。

推模型例子:

public class MainClient {/**
* @param args
*/
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver();
subject.attach(observer);
subject.change("new State");
}
} import java.util.ArrayList;
import java.util.List; /*
* 抽象主题角色类
*/
public abstract class Subject {private List<Observer> list = new ArrayList<Observer>();public void attach(Observer observer) {
list.add(observer);
System.out.println("Attached an Observer!");
} public void notifyObservers(String state) {
for (Observer observer : list) {
observer.update(state);
}
}
}

/* * 具体主题角色类 * 将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者 */

public class ConcreteSubject extends Subject {private String state;public String getState() {
return state;
}public void change(String newState) {
state = newState;
System.out.println("主题状态发生改变: " + state);
this.notifyObservers(state);
}
}

/* * 抽象观察者角色类 */

public interface Observer {
public void update(String state);
}

/* * 具体观察者角色类 * 实现抽象观察者所定义的更新接口 */

public class ConcreteObserver implements Observer{private String observerState;public void update(String state) {
observerState = state;
System.out.println("状态为:"+observerState);
}
}

运行结果:

Attached an Observer! 主题状态发生改变: new State 状态为:new State

拉模型示例:

public class MainClient {/**
* @param args
*/
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver();
subject.attach(observer);
subject.change("new State");
}
}
import java.util.ArrayList;
import java.util.List;

/* * 抽象主题角色类 */

public abstract class Subject {private List<Observer> list = new ArrayList<Observer>();public void attach(Observer observer) {
list.add(observer);
System.out.println("Attached an Observer!");
} public void notifyObservers() {
for (Observer observer : list) {
observer.update(this);
}
}
}

/* * 具体主题角色类 * 将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者 */

public class ConcreteSubject extends Subject {private String state;public String getState() {
return state;
}public void change(String newState) {
state = newState;
System.out.println("主题状态发生改变: " + state);
this.notifyObservers();
}

/* * 抽象观察者角色类 */

public interface Observer {
public void update(Subject subject);

/* * 具体观察者角色类 * 实现抽象观察者所定义的更新接口 */

public class ConcreteObserver implements Observer{private String observerState;public void update(Subject subject) {
observerState = ((ConcreteSubject)subject).getState();;
System.out.println("状态为:"+observerState);
}
}

运行结果:

Attached an Observer! 主题状态发生改变: new State 状态为:new State

设计模式-观察者模式就总结到这里,如有问题,欢迎指正,谢谢。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台