什么是观察者模式
观察者模式定义了对象之间一种一对多的关系,即一个对象发生改变的时候,会通知其他相关的对象。
观察者模式的好处降低了观察目标(被观察者)和观者者的耦合关系。
使用场景:观察者模式一般用于订阅功能,微博订阅,当我们订阅了一个博主,当博主发布了文章就会通知我们。
我们看如上面的类图,它 其实就是2个接口和2个实现类。 subject(主题、观察目标、被观察者):这是一个接口定义了添加、删除、和通知观察者的方法 observer(观察者):这是一个接口定义了接收通知的方法。 concreateSubject:主题的具体实现方法,维护了一个观察者的list concreteObserber:观察者的具体实现方法。
实战小demo
我们假设本博客发布一篇文章,需要通知各位粉丝来阅读。 分析:主题、被观察者、观察者目标就是本博客,粉丝就是观察者。
被观察者接口
代码语言:javascript复制package com.ding;
public interface Subject {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
观察者接口
代码语言:javascript复制package com.ding;
public interface Observer {
public void update(String msg);
}
被观察者实现类
代码语言:javascript复制package com.ding;
import java.util.ArrayList;
import java.util.List;
public class BlogSubject implements Subject{
// 面向接口编程,这里泛型是接口
private List<Observer> observerList = new ArrayList<>();
/**
* 添加观察者
*/
@Override
public void addObserver(Observer observer) {
this.observerList.add(observer);
}
/**
* 移除观察者
*/
@Override
public void removeObserver(Observer observer) {
this.observerList.remove(observer);
}
/**
* 发生改变通知所有的观察者
*/
@Override
public void notifyObserver() {
this.observerList.forEach(o->{
o.update("我发布了新的文章。。。");
});
}
}
观察者实现类
代码语言:javascript复制package com.ding;
public class FansObserver1 implements Observer{
@Override
public void update(String msg) {
System.out.println("我是粉丝1:" msg);
}
}
测试
代码语言:javascript复制package com.ding;
public class ObserverTest {
public static void main(String[] args) {
BlogSubject blogSuject = new BlogSubject();
FansObserver1 fans1 = new FansObserver1();
FansObserver2 fans2 = new FansObserver2();
blogSuject.addObserver(fans1);
blogSuject.addObserver(fans2);
blogSuject.notifyObserver();
System.out.println("----------分割---------");
blogSuject.removeObserver(fans1);
blogSuject.notifyObserver();
}
}
输出
我是粉丝1:我发布了新的文章。。。
我是粉丝2:我发布了新的文章。。。
----------分割---------
我是粉丝2:我发布了新的文章。。。
java自带的观察者模式
累了,以后再写
这短短的一生我们最终都会失去,不妨大胆一点,爱一个人,攀一座山,追一个梦