设计模式-行为型模式-Observer 观察者模式
1.简介
软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的;
观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对象可以看到这一个改变;
很多事基于多态来实现;
2.角色
- Subject :主题接口,通知观察者使用这个attach 方法注册, detach 注销 ,notify() 提示变更
- ConcreteSubject:具体主题,Subject 接口的具体实现,实现观察者在链表的注册和注销,状态改变
- Observer:观察者,当状态变更 需要做什么事情
- ConcreteObserver:具体观察者,实现 Observer 的状态变更实现
3.场景
写个例子
设计一个钱包到账,支付宝,银行划款;
3.1.被观察者
interface Subject {
void attach(Observer obsercer);
void detach(Observer obsercer);
void notifyObserver();
}
class Wallet implements Subject {
public boolean moneyState = false;
List<Observer> observers = new ArrayList<>();
public boolean isMoneyState() {
return moneyState;
}
public void setMoneyState(boolean moneyState) {
this.moneyState = moneyState;
System.out.println("钱包钱到账");
notifyObserver();
}
@Override
public void attach(Observer obsercer) {
observers.add(obsercer);
}
@Override
public void detach(Observer obsercer) {
observers.remove(obsercer);
}
@Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.updateMoney();
}
}
}
3.2 观察者
interface Observer {
void updateMoney();
}
class BankObserver implements Observer {
@Override
public void updateMoney() {
System.out.println("还银行钱");
}
}
class AliPayObserver implements Observer {
@Override
public void updateMoney() {
System.out.println("还花呗钱");
}
}
3.3 测试
public static void main(String[] args) {
Wallet wallet = new Wallet();
wallet.attach(new BankObserver());
wallet.attach(new AliPayObserver());
wallet.setMoneyState(true);
}
//效果是
Connected to the target VM, address: '127.0.0.1:62672', transport: 'socket'
钱包钱到账
还银行钱
还花呗钱
3.4 总结
根据这个模式有点像 责任链模式,下面来总结一下那些异同点:
相同点:都是先把观察者和处理器 添加到一个业务链表,在根据业务来做每个观察者和处理器链的遍历;
不同点:1. 责任链有一个先进后出的过程,观察者没有这个过程 ;2. 责任链可以根据处理器链路来中断后面的链路;