观察者模式(行为型)
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
一、观察者模式介绍
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
1、业务场景:很好吃,但是库存没了,许多顾客都关注青芒何时能到货?
2、观察者模式 ---------一个对象状态改变时通知其他对象。为的是尽量弱化对象间的依赖。
3、时序图:观察者模式 ---------一个对象状态改变时通知其他对象。
二、测试代码:
1、创建观察的接口:
public interface Observer {
void update();
}
2、被通知的客户:
public class CustomerObserver implements Observer {
private String name;
public CustomerObserver(String name){
this.name = name;
}
@Override
public void update() {
System.out.println(name + "购买青芒");
}
}
3、创建关注的抽象类:
import java.util.ArrayList;
import java.util.List;
public abstract class Attentions {
//关注客户列表
protected List<Observer> observers = new ArrayList();
//关注顾客
public void add(Observer observer) {
observers.add(observer);
}
//取消关注
public void remove(Observer observer) {
observers.remove(observer);
}
//发通知
public abstract void notifyObservers();
}
4、到货通知类的创建:
public class MangoAttention extends Attentions{
@Override
public void notifyObservers() {
//遍历观察者集合,调用每一个顾客的购买方法
for(Observer obs : observers) {
obs.update();
}
}
//芒果到货了
public void perform(){
this.notifyObservers();
}
}
5、客户端测试代码:
/**
* 观察者模式
* 顾客关注了芒果,降价时通知他们
*/
public class ObserverClient {
public static void main(String[] args) {
MangoAttention attentions = new MangoAttention();//目标
attentions.add(new CustomerObserver("nandao"));
attentions.add(new CustomerObserver("anan"));
attentions.add(new CustomerObserver("lili"));
attentions.add(new CustomerObserver("lisi"));
//到货
attentions.perform();
}
}
6、执行结果:
三、JDK 对观察者模式的支持
1、Java本身也对观察者模式做了支持:
2、测试代码:到货通知创建,继承JDK的观察的抽象类;
import java.util.Observable;
public class Mango extends Observable {
private String name;
public Mango(String name){
this.name = name;
}
//芒果到货了
public void perform(){
this.setChanged();
this.notifyObservers();
}
}
3、 需要通知的客户端类:
import java.util.Observable;
import java.util.Observer;
public class Customer implements Observer {
private String name;
public Customer(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(name + "购买青芒");
}
}
4、客户端测试类:
/**
* 观察者模式
* 顾客关注了芒果商品,到货时通知他们
*/
public class JdkObserverClient {
public static void main(String[] args) {
Mango attentions = new Mango("芒果");
attentions.addObserver(new Customer("nandao"));
attentions.addObserver(new Customer("anan"));
attentions.addObserver(new Customer("lisi"));
attentions.addObserver(new Customer("mark"));
attentions.perform();
}
}
5、 执行结果:
到此观察者模式分享完毕,下一篇我们分享命令模式,敬请期待!