java 观察者模式

/** 抽象的观察者 */
public interface Watcher {
    // status 为 被被观察着传递过来的状态
    public void update(String status);
}
import java.util.LinkedList;

/** 抽象的被观察者 */
public abstract class Watched {
    /** 用来保存注册的观察者对象 */
    protected LinkedList<Watcher> watcherList = new LinkedList<Watcher>();

    /** 注册观察者对象 */
    public abstract void add(Watcher watcher);

    /** 删除观察者对象 */
    public abstract void remove(Watcher watcher);

    /** 通知所有注册的观察者对象 */
    public abstract void notifyWatchers();
}
// 具体的观察者
public class Boy implements Watcher {

    @Override
    public void update(String status) {
        System.out.println(this + " 监听到状态 " + status);
    }
}
/** 具体的被观察者: 添加和删除方法最好加上同步 */
public class Girl extends Watched {
    private String status;

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public synchronized void add(Watcher watcher) {
        watcherList.add(watcher);
    }

    @Override
    public synchronized void remove(Watcher watcher) {
        watcherList.remove(watcher);
    }

    @Override
    public void notifyWatchers() {
        for (Watcher w : watcherList) {
            w.update(status);
        }
    }
}

测试代码与结果

public class Test {
    public static void main(String[] args) throws Exception {
        Girl girl = new Girl();
        for (int i = 0; i < 3; i++) {
            girl.add(new Boy());
        }
        girl.setStatus("happy");
        girl.notifyWatchers();
        TimeUnit.SECONDS.sleep(1);
        girl.setStatus("unhappy");
        girl.notifyWatchers();
    }
}

 

参考: 

http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

posted @ 2016-12-30 16:24  MarcoReus  阅读(151)  评论(0编辑  收藏  举报