【设计模式】观察者模式

啥是观察者模式呐?

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
总结:天网恢恢 不疏不漏
所谓道高一尺魔高一丈也就是这样,只要你有政策(动作),我必然有对策

实现方式(附图) 模拟不同的观察者对温度变化做出反应
观察者模式

被观察者类:Observable.java

package com.lagersoft.test;

import java.util.ArrayList;
import java.util.List;

//被观察者
public class Observable {

       private List<Observer> observers  = new ArrayList<Observer>();

       //温度状态
       private int state;

       public int getState() {
          return state;
       }

       public void setState(int state) {
          this.state = state;
          notifyAllObservers();
       }

       //添加一个观察者
       public void attach(Observer observer){
          observers.add(observer);      
       }

       //通知所有订阅了当前被观察者的观察者
       public void notifyAllObservers(){
          for (Observer observer : observers) {
             observer.update();
          }
       } 
}

观察者抽象类 Observer.java

package com.lagersoft.test;

//观察者
public abstract class Observer {

    //被观察的对象
    protected Observable subject;

    public abstract void update();

}

观察者实现类1 FirstObserver.java

package com.lagersoft.test;

/**
 * 实现观察者1
 * @author Administrator
 *
 */
public class FirstObserver extends Observer{
    //构造时
      public FirstObserver(Observable subject){
          this.subject = subject;
          this.subject.attach(this);
       }

       @Override
       public void update() {
          System.out.println( "First观察到温度变化: " +  subject.getState()); 
       }
}

观察者实现类2 SecondObserver.java

package com.lagersoft.test;

/**
 * 实现观察者2
 * @author Administrator
 *
 */
public class SecondObserver extends Observer{
      public SecondObserver(Observable subject){
          this.subject = subject;
          this.subject.attach(this);
       }

       @Override
       public void update() {
          if(subject.getState() > 12){
              System.out.println( "Second感受到温度变化: " +  subject.getState() + "热死了");
          }else{
              System.out.println( "Second感受到温度变化: " +  subject.getState() + "这就很舒服了");
          }

       }
}

测试程序Main.java

package com.lagersoft.test;

public class Main {
    public static void main(String[] args) {
        Observable subject = new Observable();
        //构造观察者
        new FirstObserver(subject);
        new SecondObserver(subject);
        System.out.println("当前温度: 15℃");
        //被观察者载入温度
        subject.setState(15);
        System.out.println("当前温度: 10℃");
        //被观察者载入温度
        subject.setState(10);
    }
}

输出:

当前温度: 15℃
First观察到温度变化: 15
Second感受到温度变化: 15热死了
当前温度: 10℃
First观察到温度变化: 10
Second感受到温度变化: 10这就很舒服了

注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值