美文网首页
观察者模式

观察者模式

作者: herenoone | 来源:发表于2016-05-09 09:19 被阅读0次

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

观察类似于利用报纸订阅服务,只要订阅者订阅了该报纸,只要报纸一出版,订阅者就会收到报纸。
只不过名称不一样,出版者改称为主题(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

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

      本文链接:https://www.haomeiwen.com/subject/bwarrttx.html