行为型之观察者模式

 观察者(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
张三购进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值