美文网首页
观察者模式

观察者模式

作者: 请叫我刚爷 | 来源:发表于2019-12-18 18:51 被阅读0次

1、观察者模式,个人理解为发布/订阅关系。订阅者为观察者,发布者为被观察者。同时观察者模式jdk提供了自带的版本。使用哪一个就看书写者的心情了。
简单的讲观察者模式类似买报纸,使用观察者模式后,报纸发行商只要报纸有更新,就会派人将报纸发送给各个用户。非观察者模式则需要各个用户有时间了去找发行商。

2、观察者模式实现步骤
(1)定义观察者(报纸用户,订阅者),被观察者(报纸发行商,发布者)两个接口。观察者需要提供更新消息的接口。被观察者需要实现观察者的订阅方法、移除订阅方法、更新消息的方法等。
(2)定义两个接口的实现类,用以执行具体功能。
(3)就是具体实现了,观察者需要订阅被观察者,被观察者讲更新相关消息将同步到其他观察者。

3、自定义观察者模式实现
(1)两个接口Observer、Subject。Subject为被观察者接口,Observer为观察者接口。接口代码如下:

/**
 * 观察者接口
 */
public interface demoObserver {
    public void demoUpdate(String str);
}
/**
 * 报纸发行方接口
 * 被观察者
 */
public interface demoSubject {
    public void addUser(demoObserver obj); //添加订阅者
    public void removeUser(demoObserver obj); //移除订阅
    public void dataChange(String str); //更新
}

(2)填写接口实现类

/**
 * 报纸订阅用户i
 * 观察者
 */
public class user1 implements demoObserver{
    @Override
    public void demoUpdate(String str) {
        System.out.println("用户1收到了报纸:"+str);
    }
}
//发行方,被观察者
public class subject implements demoSubject { 
    public ArrayList<demoObserver> observer = new ArrayList<demoObserver>();
 
    @Override
    public void addUser(demoObserver obj) {
        observer.add(obj);
    }
     
    @Override
    public void removeUser(demoObserver obj) {
        observer.remove(obj);
    }
     
    @Override
    public void dataChange(String str) {
        for(int i=0,len=observer.size();i<len;i++)
        {
            observer.get(i).demoUpdate(str);;
        }
    }
}

(3)测试案例

/**
 * 手写观察模式
 */
public class Main {
    public static void main(String[] args) {
        user1 user1 = new user1();
        user2 user2 = new user2();
        user3 user3 = new user3();
         
        subject sub = new subject();
        sub.addUser(user1);
        sub.addUser(user2);
        sub.addUser(user3);
         
        sub.dataChange("123");
    }
}

4、java自带的观察者模式
java自带的观察者模式与自定义的观察者模式略有不同。个人不太喜欢这种方式,因为java不允许多继承,造成了无法定制化开发。如下
(1)被观察者(报纸发行方)不再是接口,而是类Observable。即你需要继承类而不是实现具体接口。观察者(报纸订阅用户)没有变化,需要实现接口Observer
(2)被观察者继承Observable之后,无需手写添加、移除订阅,以及更新消息等方法。
(3)被观察者继承于Observable,也无需手写添加、移除订阅等相关代码,
5、java自带的观察者模式具体实现
(1)观察者实现Observer接口,被观察者继承Observable。代码如下

/**
 *  被观察者即报纸发行方
 */
public class javaObservable extends Observable {
public void dataChange(String str){
this.setChanged(); //通知观察者有新的数据了
this.notifyObservers(str); //开始更换数据
}
}
/**
 * j观察者,即用户订阅者
 */
public class javaObserver implements Observer { 
@Override
public void update(Observable o, Object arg) {
System.out.println("用户0接收到数据" + arg.toString());
}
}

(2)测试

public class main {
public static void main(String[] args) {
javaObservable observale = new javaObservable();
 
javaObserver observer = new javaObserver();
javaObserver1 observer1 = new javaObserver1();
javaObserver2 observer2 = new javaObserver2();
//添加订阅者
observale.addObserver(observer);
observale.addObserver(observer1);
observale.addObserver(observer2);
 
observale.dataChange("qwe");
}
}

相关文章

  • 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/zmnunctx.html