一、概念
一个对象状态改变时通知其他对象。为的是尽量弱化对象间的依赖。
包含两种对象,分别是目标对象和观察者对象。在目标对象和观察者对象间存在着一种一对多的对应关系,当这个目标对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并执行它们各自特有的行为。
二、举例
目标对象:青芒果
观察者对象:客户
一对多的关系
三、类结构设计
四、代码示例
目标类
/**
* 目标对象
*/
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();
}
/**
* 目标对象实现类-青芒果
*/
public class MangoAttention extends Attentions{
/**
* 发通知
*/
@Override
public void notifyObservers() {
//遍历观察者集合,调用每一个的联系方式,发通知
observers.forEach(Observer::sendMessage);
}
/**
* 芒果到货了
*/
public void perform(){
this.notifyObservers();
}
}
观察者对象
/**
* 观察者-接口
*/
public interface Observer {
void sendMessage();
}
public class CustomerObserver implements Observer {
private String name;
private String mobile;
public CustomerObserver(String name, String mobile) {
this.name = name;
this.mobile = mobile;
}
@Override
public void sendMessage() {
System.out.println("发送通知到 " + mobile);
System.out.println("尊敬的" + name + " ,可以购买青芒了");
System.out.println("~~~~");
}
}
客户端
/**
* 观察者模式
* <p>
* 顾客关注了芒果,降价时通知他们
*/
public class Client {
public static void main(String[] args) {
//目标对象-青芒果
MangoAttention attentions = new MangoAttention();
// 添加管住列表
attentions.add(new CustomerObserver("张三", "08-123"));
attentions.add(new CustomerObserver("李四", "08-456"));
attentions.add(new CustomerObserver("王五", "08-789"));
attentions.add(new CustomerObserver("法外狂徒", "08-111"));
//到货发通知
attentions.perform();
}
}
五、JDK 对观察者模式的支持
/**
* 可观察的对象
*/
public class Mango extends Observable {
private String name;
public Mango(String name){
this.name = name;
}
/**
* 芒果到货了
*/
public void perform(){
this.setChanged();
this.notifyObservers();
}
}
/**
* 观察者对象-客户
*/
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 + "购买青芒");
}
}
/**
* 观察者模式
* 顾客关注了芒果商品,到货时通知他们
*/
public class JdkObserverClient {
public static void main(String[] args) {
Mango attentions = new Mango("芒果");
attentions.addObserver(new Customer("deer"));
attentions.addObserver(new Customer("james"));
attentions.addObserver(new Customer("lison"));
attentions.addObserver(new Customer("mark"));
attentions.perform();
}
}