Design pattern--观察者模式

Design pattern–观察者模式

什么是观察者模式

观察者模式:是对象的行为模式,又叫发布-订阅(Publish-Subscribe)模式,模型-视图(Model-View)模式或源-监听(Source-Listener)模式。

观察者模式定义一种一对多的依赖关系,让多个观察者同时监听一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够更新自己。

观察者模式


看个例子,假设爱奇艺客户端是一个主题,当有电视剧更新的时候,vip用户能够第一时间收到通知,这里就需要使用观察者模式来实现。

// Observer.java
public interface Observer {
  void update(String state);
}

// VIPObserver.java
public class VIPObserver implements Observer{
  public String userName;
  public VIPObserver(String userName) {
    this.userName = userName;
  }
  @Override public void update(String state) {
    System.out.println(userName + "收到一条消息,电视剧" + state + "更新了!!");
  }
}

观察者(VIPObserver)中的update方法正是主题(IqiyiSubject)在变更的时候调用的,下面看下主题的实现

// Subject.java
public abstract class Subject {
  public ArrayList<Observer> observers = new ArrayList<>();
  public void attach(Observer observer) {
    observers.add(observer);
  }

  public void dettach(Observer observer) {
    observers.remove(observer);
  }

  public void notifyObservers(String state) {
    for (Observer observer : observers) {
      observer.update(state);
    }
  }

  public abstract void change(String state);
}

// IqiyiSubject.java
public class IqiyiSubject extends Subject{
  @Override public void change(String state) {
    notifyObservers(state);
  }
}

主题(IqiyiSubject)和观察者(VIPObserver)都定义完成了,接下来调用一下

Subject subject = new IqiyiSubject();
Observer observerA = new VIPObserver("杨幂");
Observer observerB = new VIPObserver("范冰冰");
subject.attach(observerA);
subject.attach(observerB);
subject.change("【择天记】");

运行结果:

04-29 12:04:11.209 26961-26961/com.testdes.des I/System.out: 杨幂收到一条消息,电视剧【择天记】更新了!!
04-29 12:04:11.209 26961-26961/com.testdes.des I/System.out: 范冰冰收到一条消息,电视剧【择天记】更新了!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengyuan9160

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值