【设计模式】观察者模式

来源:互联网 发布:腾讯云服务器开放端口 编辑:程序博客网 时间:2024/05/23 14:18

啥是观察者模式呐?

当对象间存在一对多关系时,则使用观察者模式(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
原创粉丝点击