观察者模式(Observer)定义:java
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),一个目标物件管理全部相依于它的观察者物件,而且在它自己的状态改变时主动发出通知。这一般透过呼叫各观察者所提供的方法来实现。此种模式一般被用来实现事件处理系统。git
类型:形为型模式 github
顺口溜:中访策备迭 观模命状职解设计模式
package com.amosli.dp.behavior.observer; public abstract class Observer { abstract void update(); } package com.amosli.dp.behavior.observer; import java.util.ArrayList; import java.util.List; public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObserver() { for (Observer observer : observers) { observer.update(); } } } package com.amosli.dp.behavior.observer; public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } } package com.amosli.dp.behavior.observer; public class ConcreteObserver extends Observer { private String name; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject, String name) { this.subject = subject; this.name = name; } private String observerState; public String getState() { return observerState; } public void setState(String state) { this.observerState = state; } @Override void update() { observerState = subject.getSubjectState(); System.out.println("观察者:" + name + " 您订阅的主题状态有更新: " + observerState); } } package com.amosli.dp.behavior.observer; public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); subject.attach(new ConcreteObserver(subject,"xa")); subject.attach(new ConcreteObserver(subject,"xb")); subject.attach(new ConcreteObserver(subject,"xc")); subject.setSubjectState("amosli又更新了设计模式系列文章哦!"); subject.notifyObserver(); } }
输出:ide
一、 对一个对象状态的更新,须要其余对象同步更新,并且其余对象的数量动态可变。
二、 对象仅须要将本身的更新通知给其余对象而不须要知道其余对象的细节。 this
1)、 Subject和Observer之间是松偶合的,分别能够各自独立改变。
2)、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer能够本身决定是否要订阅Subject的通知。
3)、 遵照大部分GRASP原则和经常使用设计原则,高内聚、低偶合。spa
1)、若是一个被观察者对象有不少的直接和间接的观察者的话,将全部的观察者都通知到会花费不少时间。设计
2)、 若是在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进 行循环调用,可能致使系统崩溃。code
3)、 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。orm
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!