美文网首页
设计模式-观察者模式

设计模式-观察者模式

作者: 探索者_逗你玩儿 | 来源:发表于2018-10-14 17:10 被阅读0次

观察者模式:在对象之间定义一对多的依赖,当对象的状态发生改变时,依赖对象就会收到通知自动更新。
我们先看看jdk提供的观察者模式到底该如何使用。首先定义一个类集成java.util.Observable,然后在状态变化的时候调用setChanged方法改变观察者内部的标志位,最后发送通知让观察者进行对应的逻辑操作

public class Student extends Observable {

    private String name;

    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        setChanged();
        notifyObservers();
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
        setChanged();
        notifyObservers();
    }
}

观察者需要实现java.util.Observer接口,在update方法中接收变化后的新对象

public class StudentObserver implements java.util.Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(o);
    }
}
public class StudentMain {


    public static void main(String[] args){
        Student student = new Student();
        student.addObserver(new StudentObserver());
        student.setName("HELLO");
        student.setSex("MALE");


    }
}

以上是jdk提供的观察者模式的实现,但是了在使用的过程中却不是那么方便,首先Observable是一个类,java中只能单继承,那么一旦被观察的对象需要集成其他的父类时,就显得很累赘,那怎么办了,其实在了解该模式的原理后完全可以自己来实现。

public interface Subject extends Serializable{

    public List<Observer> observerList = new ArrayList<Observer>();

    public void addObserver(Observer observer);

    public void removeObserver(Observer observer);

    public void notifyObservers(String key);
}
public interface Observer<T> {

    public void update(T current,String key);
}
public class Person implements Subject {

    private String name;

    private String sex;

    private int age;

    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers(String key) {
        for (Observer item: observerList) {
            item.update(this,key);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyObservers("name");
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
        notifyObservers("sex");

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        notifyObservers("age");
    }
}
public class PersonObserver implements Observer<Person> {

    @Override
    public void update(Person current,String key) {
        System.out.println("changed"+"   "+ key);
    }
}

public class PersonMain {

    public static void main(String[] args){
        Person person = new Person();
        person.addObserver(new PersonObserver());
        person.setAge(20);
        person.setName("张三");
        person.setSex("男");

    }
}

自己实现也不是那么麻烦,但跟jdk提供的实现方式一对比,我们采用来接口的方式,扩展性要好很多,但是需要在被观察的每个子类中都要实现固定的逻辑,这也是为什么jdk提供的是类而非接口了,小伙伴可以根据自己的业务需要选择具体的实现方式

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

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

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

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

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

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

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

    PHP设计模式之观察者模式

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

网友评论

      本文标题:设计模式-观察者模式

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