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

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

引用大师的话就是

观察者模式是对象的行为模式,又叫发布-订阅(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");
    }
}

运行后输出

 

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

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

 

posted on 2016-05-14 17:19  woqiaoxun  阅读(161)  评论(0编辑  收藏  举报