观察者模式
- 概述:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于他的对象都能得到通知并自动刷新.
- 帮助理解:观察者模式可以理解为,在一个一对多的关系模式中,例如一个微信公众号有多个关注用户,那么关注该微信公众号的微信用户就是观察者,微信公众号就是被观察者.一个微信公众号会有多个关注用户,这就是其中的一对多的关系.然后当一个对象的状态发生改变就是说当被观察者(微信公众号)有了改变,例如添加了新的内容.这时候所有关注该公众号的微信用户就希望能得到通知.
- 观察者模式中所包含的角色
- Subject:抽象主题(公众号这个概念) 其中抽象出来公众号所应该有的功能,例如删除和增加.抽象成方法,供以后的实现类进行实现.
- ConcreteSubject:具体主题(具体到哪一个公众号,例如本例中的”拜托了钱包"微信公众号),实现抽象主题的抽象方法,当具体主题中的状态发生变化时,给所有的观察者(关注该公众号的微信用户)发送通知.
- Observer:抽象观察者,(微信用户)他定义了一个更新接口,用于在主题更改时更新
- ConcreteObserver:具体观察者(具体的微信用户),实现抽象观察者的接口.
- 解决的问题:一个对象状态改变要给其它对象通知的问题.而且要考虑到易用性和低耦合,保证高度的协作.
- 优点
- 观察者和被观察者是抽象耦合的,所以修改比较方便,只是换一套实现类而已
- 可以建立一套触发机制
- 注意事项
- JAVA中已经有了对观察者模式的支持类
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳,所以一般采用异步方式.
代码实现
示例:现在有一个微信公众号名字为”拜托了钱包”,该公众号有多个关注用户,例如 仲永,姜子牙,坑露.想利用观察者模式设计当该微信公众号有所改变时通知所有关注用户.
抽象观察者接口
package ObserverPattern;
/**
* Created by looper on 2017/8/19.
*/
public interface Observer {
//当被观察者状态发生改变时,更新
public void show(String information);
}
具体观察者类
package ObserverPattern;
/**
* Created by looper on 2017/8/19.
*/
public class WeixinUser implements Observer {
private String name;
public WeixinUser(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void show(String information) {
System.out.println(name+" 你好 " + information);
}
}
抽象主题接口
package ObserverPattern;
/**
* Created by looper on 2017/8/19.
*/
public interface Subject {
//增加观察者
public void add(Observer observer);
//删除观察者
public void delete(Observer observer);
//通知观察者
public void notifyUser(String information);
}
具体主题类
package ObserverPattern;
import java.util.ArrayList;
import java.util.List;
/**
* Created by looper on 2017/8/19.
*/
public class ConcreteSubject implements Subject{
private List<Observer> weixinList = new ArrayList<>();
public ConcreteSubject(){
weixinList.clear();
}
@Override
public void add(Observer observer) {
weixinList.add(observer);
}
@Override
public void delete(Observer observer) {
weixinList.remove(observer);
}
@Override
public void notifyUser(String information) {
//通知所有关注用户
for (Observer observer: weixinList) {
observer.show(information);
}
}
}
测试类
package ObserverPattern;
/**
* Created by looper on 2017/8/19.
*/
public class ObserverTest {
public static void main(String[] args) {
WeixinUser zhongyong = new WeixinUser("仲永");
WeixinUser jiaziya = new WeixinUser("姜子牙");
WeixinUser kenglu = new WeixinUser("坑露");
Subject subject = new ConcreteSubject();
subject.add(zhongyong);
subject.add(jiaziya);
subject.add(kenglu);
String information = "您更新的拜托了钱包微信公众号更新了新内容.";
subject.notifyUser(information);
}
}
输出:
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我