【观察者模式】—— 订阅与发布

观察者模式,定义了一对多的关系,使得当对象状态改变时,其他目标对象会收到通知,并被自动更新。

一、关键点

1)先看下这个模式点关键点:

【观察者模式】—— 订阅与发布_第1张图片

监听:该模式的比较一个大大特点就是多对一的关系,即常说的 “订阅 — 发布” 的关系;

解耦:该模式的重要作用就是解耦,即做到观察者和被观察者之间的无依赖。

 

2)我们再看下它的类图关系:

【观察者模式】—— 订阅与发布_第2张图片

Subject:抽象对象,即被观察的角色;

ConcreteSubject:被观察者的具体实现,但目标对象状态发生变化时,给观察者发送通知;

Observer:观察者抽象类;

ConcreteObserver:具体实现的观察者,接受来自被观察者的通知,而作出相应的响应;

 

二、实现

2.1 Subject 抽象对象

public abstract class Subject {

    private List mObservers = new ArrayList<>();

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

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

    public void onNotify() {
        for (Observer observer : mObservers) {
            observer.update();
        }
    }
}

2.2  ConcreteSubject 被观察者的具体实现

public class ConcreteSubject extends Subject {

    private boolean mSubjectState;

    public boolean isSubjectState() {
        return mSubjectState;
    }

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

2.3  Observer 观察者抽象类

public abstract class Observer {

    public abstract void update();
}

2.4  ConcreteObserver具体观察者实现

public class ConcreteObserver extends Observer {

    private boolean mSubjectState;
    private ConcreteSubject mSubject;

    public ConcreteObserver(ConcreteSubject subject) {
        mSubject = subject;
    }

    @Override
    public void update() {
        mSubjectState = mSubject.isSubjectState();
    }

    public boolean isSubjectState() {
        return mSubjectState;
    }

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

2.5 Client 客户端类 

public class Client {

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

        subject.setSubjectState(true);
        subject.notify();
    }
}

 

三、小结 

3.1 订阅与发布 该模式定义了常用的订阅与发布角色,即我们常常运动的异步监听的场景,该模式去除了这两者间的耦合性;

3.2 解耦 该模式的最大特点就是解耦,将对象间的订阅发布关系解耦开来,相互间不造成影响,并能独立的拓展与变化,从而使得模块设计变得灵活起来。

 

 

 

 

你可能感兴趣的:(设计模式)