java设计模式-观察者模式学习

时间:2021-01-02 15:43:21

最近学习了设计模式中的观察者模式,在这里记录下学习成果。

观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到。只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察。

引用大师的话就是

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

下面用代码展示

1.新建接口 观察者 Observer 

/**
* 观察者
* @author admin
*
*/
public interface Observer {
public void update(String newState);
}

  观察者对象非常简单,只需一个update方法,当被观察者动作时,会通知观察者,即触发update方法

2.新建抽象类 Observable

import java.util.ArrayList;
import java.util.List; public abstract class Observable {
//观察者集合
private List<Observer> observerList = new ArrayList<Observer>(); public List<Observer> getObserverList() {
return observerList;
} public void setObserverList(List<Observer> observerList) {
this.observerList = observerList;
} /**
* 添加观察者对象
* @param obs
*/
public void attach(Observer obs){
this.observerList.add(obs);
} /**
* 删除观察者对象
* @param obs
*/
public void detach(Observer obs){
this.observerList.remove(obs);
} /**
* 动作的时候通知所有观察者
*/
public void nodifyObservers(String newState){
if(null!=observerList&&observerList.size()>0){
for(Observer obs : observerList){
obs.update(newState);
}
}
} }

3.创建观察者的继承者 ObserverImpl 

/**
* 观察者的实现方法
* @author admin
*/
public class ObserverImpl implements Observer { /**
* 当被观察者出现动作时触发
*/
public void update(String newState) {
System.out.println(newState);
}
}

4.创建被观察者的子类 ObservableEx 

public class ObservableEx extends Observable {

    /**
* 当主体发生变化时,调用通知方法
* @param newState
*/
public void change(String newState){
this.nodifyObservers(newState);
} }

5.创建客户端

import org.junit.Test;

public class Client {

    /**
* 新建三个观察者,都把他们加到list中,然后调用change方法
*/
@Test
public void test(){
Observer obs1 = new ObserverImpl();
Observer obs2 = new ObserverImpl();
Observer obs3 = new ObserverImpl(); ObservableEx obse = new ObservableEx();
obse.attach(obs1);
obse.attach(obs2);
obse.attach(obs3); obse.change("i am eating");
}
}

运行后输出

java设计模式-观察者模式学习

参见  http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

http://www.blogjava.net/supercrsky/articles/202544.html