1. 定义

  定义对象间的一对多的关系,当一个对象的状态改变时,所有依赖它的对象都得到通知并自动更新。

2. 类图

  

3. 实例

  

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年1月21日 下午3:40:21
 */
public interface Observer {
    void update(String content);
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年1月21日 下午3:47:57
 */
public class Reader implements Observer{

    private String name;
    
    public Reader(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String content) {
        // TODO Auto-generated method stub
        System.out.println("读者" + this.name + "拿到了今天的报纸,今天报纸内容是:" + content);
    }

}

package com.jerry.designpattern;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * @author Jerry
 * @date 2015年1月21日 下午3:39:36
 */
public class Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    
    protected void addObserver(Observer observer) {
        observers.add(observer);
    }
    
    protected void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    protected void notifyObservers(String content) {
        Iterator<Observer> iterator = observers.iterator();
        while (iterator.hasNext()) {
            Observer observer = iterator.next();
            observer.update(content);
        }
    }
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年1月21日 下午3:50:45
 */
public class Newspaper extends Subject{
    private String content;
    
    public void setContent(String content) {
        this.content = content;
        super.notifyObservers(this.content);
    }
}

package com.jerry.designpattern;
/**
 * 
 * @author Jerry
 * @date 2015年1月21日 下午3:51:49
 */
public class Client {
    public static void main(String[] args) {
        Newspaper newspaper = new Newspaper();
        
        /*
         * 创建若干读者
         */
        Reader reader1 = new Reader("唐三藏");
        Reader reader2 = new Reader("孙悟空");
        Reader reader3 = new Reader("猪悟能");
        Reader reader4 = new Reader("沙悟净");
        newspaper.addObserver(reader1);
        newspaper.addObserver(reader2);
        newspaper.addObserver(reader3);
        newspaper.addObserver(reader4);
        
        newspaper.setContent("唐僧师徒四人大闹女儿国");
    }
}

4. 优缺点

  观察者模式的优点

  a. 观察者实现了观察者和目标之间的抽象耦合

  b. 观察者实现了动态联动

  c. 观察者支持广播通信

  观察者模式的缺点

   由于观察者模式每次都是广播通信,不管观察者需不需要,每个观察者都会被调用update方法,如果观察者不需要执行相应处理,那么这次操作就浪费了。

posted on 2015-02-11 21:18  爱生活的夜  阅读(97)  评论(0编辑  收藏  举报