观察者模式

2016-05-09  本文已影响0人  herenoone

观察者模式——在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

观察类似于利用报纸订阅服务,只要订阅者订阅了该报纸,只要报纸一出版,订阅者就会收到报纸。
只不过名称不一样,出版者改称为主题(subject),订阅者改称为观察者(observer)。

观察者模式很适合下面这些场景中的任何一个:
当你的架构有两个实体类,一个依赖另一个,你想让它们互不影响或者是独立复用它们时。
当一个变化的对象通知那些与它自身变化相关联的未知数量的对象时。
当一个变化的对象通知那些无需推断具体类型的对象时。

以下是代码示例

package observe_v3;
/**
 * 这是主题接口,对象使用此接口注册成为观察者,或是删除
 * 还有一个通知观察者的功能
 * */
public interface Subject {
    
    public void addWatcher(Watcher w);
    
    public void deleteWatcher(Watcher w);

    public void notifyWatcher();
}
package observe_v3;
/**
 * 观察者接口,所有的观察者都要实现该接口
 * */
public interface Watcher {
    public void update(Object o);
}
package observe_v3;

import java.util.ArrayList;
import java.util.List;
/**
 *具体的可观察者
 * */
public class ConcreteSubject implements Subject {
    
    private List<Watcher> watchers = new ArrayList<>();
    
    private String str;

    @Override
    public void addWatcher(Watcher w) {
        watchers.add(w);
    }

    @Override
    public void deleteWatcher(Watcher w) {
        watchers.remove(w);
    }

    @Override
    public void notifyWatcher() {
        for(Watcher w : watchers){
            w.update(str);
        }
    }
    
    public String getStr(){
        return str;
    }
    
    public void setStr(String str){
        this.str = str;
    }
}
package observe_v3;

public class ConcreteWatcher implements Watcher {
    
    private String name;
    
    private Subject sub;
    
/*  public ConcreteWatcher(String str){
        this.name = str;
    }*/
//  这是在构造函数的时候就添加观察者了
    public ConcreteWatcher(Subject s, String name) {
        sub = s;
        this.name = name;
        s.addWatcher(this);//别忘了在这边添加注册观察者
    }

    @Override
    public void update(Object o) {
        System.out.println(name + ";;" + o);
    }
}
package observe_v3;

public class Program {

    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteWatcher cw1 = new ConcreteWatcher(subject, "A");
        
        ConcreteWatcher cw2 = new ConcreteWatcher(subject, "B");
        
        ConcreteWatcher cw3 = new ConcreteWatcher(subject, "C");
        
        subject.setStr("Ready");
        
        subject.notifyWatcher();
    }
}

输出结果:
A;;Ready
B;;Ready
C;;Ready

上一篇 下一篇

猜你喜欢

热点阅读