我是靠谱客的博主 犹豫百合,最近开发中收集的这篇文章主要介绍观察者模式学习总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

就是说在一对多的对应关系中,一个对象的变化会导致一系列对象的响应的变化。
那如何去实现呢?我们想到的一定是接口,主对象去调用一系列从对象实现的相同接口。
要做到这一点,除了从对象都要去实现接口以外,要把这些对象都加到主对象中,让主对象来遍历调用。

那么不如将主对象中对从对象的添加删除和遍历都抽象出来。看代码
先看从对象接口:

public interface Observer {

    void update();
}

再看主对象抽象

public abstract class Subject {
    protected List<Observer> observers = new ArrayList<Observer>();


    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void notifier() {
        for(Observer observer : observers) {
            observer.update();
        }
    }

}

notifier函数就是遍历功能实现。
不需要关心具体的那个从对象被通知到了,主要将加入主对象队列的从对象实现的接口都遍历一遍,这就实现了通知所有从对象的功能。

来看具体主对象代码,这里我没有将具体主对象的属性放到抽象里面是为了说明,Subject也是一个接口,它就是为了添加从对象和遍历用的。

public class ConcreteSubject extends Subject {
    private String subjectState;

    public ConcreteSubject(String subjectState) {
        this.subjectState = subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }

    public String getSubjectState() {
        return subjectState;
    }
}

看从对象实现接口代码:

public class ConcreteObserver implements Observer {
    private String name;
    private String observerState;
    private ConcreteSubject subject;

    public ConcreteObserver(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }

    public void setObserverState(String observerState) {
        this.observerState = observerState;
    }

    public String getObserverState() {
        return observerState;
    }

    @Override
    public void update() {
        System.out.println("老师" + subject.getSubjectState() + " " + name + "不要" + getObserverState() + "了!");
    }
}

ConcreteObserver对ConcreteSubject的观察:subject.getSubjectState()
并实现了Update接口。

看主函数代码:

ConcreteSubject teacher = new ConcreteSubject("走下讲台看看");
ConcreteObserver student1 = new ConcreteObserver("小伟",teacher);
student1.setObserverState("看nba");
ConcreteObserver student2 = new ConcreteObserver("小李",teacher);
student2.setObserverState("刷微博");
teacher.attach(student1);
teacher.attach(student2);
teacher.notifier();

student1和student2都实现了update接口;
teacher-ConcreteSubject实现了subject接口,并将student1和student2加入了接口中的teacher-ConcreteSubject的List供teacher-ConcreteSubject的notifier调用。

观察者的观察就是获得具体对象的状态:subject.getSubjectState()
而具体对象的通知,就是Subject的notifier接口调用Observer的update接口。
完美符合依赖倒转原则的按接口编程思想。

补充:在学习《重构》时,在8.6节,Duplicate Observed Data(复制“被监视数据”)时,观察者模式用于将客户端包含的数据独立出来,并保持与业务逻辑数据同步的情况。java.util中实现了Observable和Observer来个接口,只要去调用就可以了。看下面的链接:设计模式之观察者模式(Observable与Observer)

最后

以上就是犹豫百合为你收集整理的观察者模式学习总结的全部内容,希望文章能够帮你解决观察者模式学习总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部