观察者(Observer)模式
一、“订阅 — 发布”模型:存在 主题对象(一个)
“观察者”对象(多个)
二、解决的问题:
1、“通知 — 依赖”关系
2、一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
3、一般来说,“主题对象”和“观察者”对象之间是紧耦合。
4、希望将“主题对象”和“观察者”对象之间解耦。
三、结构
1、主题对象,包含一些信息(属性),包含添加观察者和删除观察者的方法,还应该包含一个“通知”的方法;
2、观察者接口,规定更新主题的方法;
3、具体的观察者实现“观察者接口”。
四、要点
1、使用面向对象的抽象, Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
2、目标对象并不知道观察者对象的存在。
以炒股为例:
package v_2;
public interface IObserver {//观察者接口
public void update(Stock stock);
}
__________________
package v_2;
import java.util.ArrayList;
import java.util.List;
public class Stock {
//主题对象,包含添加观察者和删除观察者的方法
//还应该包含一个“通知”的方法
private String name;
private double price;
private List<IObserver> observers;
public Stock(String name, double price) {
this.name = name;
this.price = price;
observers = new ArrayList<IObserver>();
}
public void addObserver(IObserver observer){
//添加观察者
observers.add(observer);
}
public void removeObserver(IObserver observer){
// 移除观察者
observers.remove(observer);
}
public void tongZhi(){ //通知各个观察者对象
for (IObserver o : observers){
o.update(this);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
________________
package v_2;
public class Lisi implements IObserver {// 观察者对象
public void update(Stock stock) {
System.out.println("通知李四,股票的价格变成了:"+stock.getPrice());
if(stock.getPrice() < 20){
System.out.println("李四退出");
}
}
}
____________________
package v_2;
public class Zhangsan implements IObserver {
// 观察者对象
public void update(Stock stock) {
System.out.println("通知张三,股票的价格变成了:"+stock.getPrice());
if(stock.getPrice() < 50){
System.out.println("张三购进");
}
}
}
_____________________
package v_2;
public class Test {
public static void main(String[] args) {
Stock stock = new Stock("ms",100);
IObserver zhangsan = new Zhangsan();
IObserver lisi = new Lisi();
stock.addObserver(zhangsan);
stock.addObserver(lisi);
stock.removeObserver(lisi);
stock.setPrice(30);
stock.tongZhi();
}
}
通知张三,股票的价格变成了:30.0
张三购进

被折叠的 条评论
为什么被折叠?



