定义:
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得 到通知并被自动更新。
观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型 -视图(Model/View)模式、源-监听器(Source/Listener) 模式或从属者(Dependents)模式
观察者模式是一种对象行为型模式
优点:
可以实现表示层和数据逻辑层的分离
在观察目标和观察者之间建立一个抽象的耦合
支持广播通信,简化了一对多系统设计的难度
符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者不观察目标之间不存在关联关系的情况下,增加新的 观察目标也很方便
缺点:
将所有的观察者都通知到会花费很多时间
如果存在循环依赖时可能导致系统崩溃
没有相应的机制让观察者知道所观察的目标对象是怎么发生变化 的,而只是知道观察目标发生了变化
适用范围:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用
一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁
需要在系统中创建一个触发链
实例:
实例UML:
实例目录:
实例代码:
Stock.java
package observer;
import java.util.ArrayList;
public class Stock {
private String stockName;
private double price;
private ArrayList<Investor> list=new ArrayList<Investor>();
public Stock(String stockName,double price){
this.stockName=stockName;
this.price=price;
}
public String getStockName() {
return stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public void attach(Investor investor){
list.add( investor);
}
public void detach(Investor investor){
list.remove( investor);
}
public void notifyInvestor(){
for (Investor i:list){
System.out.println(this.stockName);
System.out.println(this.price);
((Investor)i).excute();
}
}
}
Investor.java
package observer;
public interface Investor {
public void excute();
}
ConcreteInvestor.java
package observer;
public class ConcreteInvestor implements Investor {
@Override
public void excute() {
System.out.println("WARNING:");
System.out.println("价格变化超过5%");
}
}
Client.java
package observer;
public class Client {
public static void main(String[] args) {
Stock stock=new Stock("大众",12.8);
Investor concreteInvestor=new ConcreteInvestor();
stock.attach(concreteInvestor);
stock.notifyInvestor();
System.out.println("软件1928 2019006175");
}
}
运行结果截图: