Java设计模式2:观察者模式1

来源:互联网 发布:驱鼠音频软件 编辑:程序博客网 时间:2024/05/29 10:17

一.观察者模式
1.观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
2.它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。
3.实现观察者模式有很多形式,一种是“注册—通知—撤销注册”的形式。
4.分类:
Subject(主题)
Observer(观察者)
这里写图片描述
这里写图片描述

二.案例
1.气象站的数据被各大电视台即时报导
◆interface Subject.java (主题父接口(可有多个不同子主题实现))

package tiglle.pattern.Observer;//主题父接口(可有多个不同子主题实现)public interface Subject {    //注册观察者    public void registerObserver(Observer o);    //删除观察者    public void removeObserver(Observer o);    //当主题状态发生改变,调用此方法通知观察者    public void notifyObserver();}

◆interface Observer.java(观察者父接口(可由多个不同子观察者实现))

package tiglle.pattern.Observer;//观察者父接口(可由多个不同子观察者实现)public interface Observer {    //当主题状态发生改变,会调用此方法并传入主题的参数    public void update(int wendu,int shidu,int qiya);}

◆class WeatherData.java(主题的一个子主题实现类(气象站))

package tiglle.pattern.Observer;import java.util.ArrayList;import java.util.List;//主题的一个子主题实现类(气象站)public class WeatherData implements Subject{    //天气参数    private int wendu;//温度    private int shidu;//湿度    private int qiya;//气压    //记录注册的观察者    private List<Observer> observers;    //构造方法,实例化observers    public WeatherData(){        observers = new ArrayList<>();    }    //注册观察者    @Override    public void registerObserver(Observer o) {        observers.add(o);    }    //移除观察者    @Override    public void removeObserver(Observer o) {        int index = observers.indexOf(o);        if(index>=0){            observers.remove(index);        }    }    //当主题状态发生改变,调用此方法通知观察者    @Override    public void notifyObserver() {        for(Observer o:observers){            o.update(wendu, shidu, qiya);        }    }    //天气(主题子类)发生改变调用的方法,通知观察者    public void weatherChanged(){        //真正通知观察者        notifyObserver();    }    //设置天气参数,并通知观察者    public void setWeatherParame(int wendu,int shidu,int qiya){        this.wendu = wendu;        this.shidu = shidu;        this.qiya = qiya;        //通知观察者        weatherChanged();    }}

◆interface Report.java(报导天气接口)

package tiglle.pattern.Observer;//报导天气接口public interface Report {    public void report();}

◆class HuNanTv.java(湖南电视台:观察者一个子实现类)

package tiglle.pattern.Observer;//湖南电视台:观察者一个子实现类public class HuNanTv implements Observer,Report{    //天气属性    private int wendu;    private int shidu;    private int qiya;    //主题子实现类,用于构造函数中注册观察者    private Subject subject;    //构造函数,注册观察者    public HuNanTv(Subject subject) {        this.subject = subject;        subject.registerObserver(this);    }    //改变天气属性    @Override    public void update(int wendu, int shidu, int qiya) {        this.wendu = wendu;        this.shidu = shidu;        this.qiya = qiya;        //报导天气        report();    }    //报导天气    @Override    public void report() {        System.out.println("湖南人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);    }}

◆class HuBeiTv.java

package tiglle.pattern.Observer;//湖北电视台:观察者一个子实现类public class HuBeiTv implements Observer,Report{    //天气属性    private int wendu;    private int shidu;    private int qiya;    //主题子实现类,用于构造函数中注册观察者    private Subject subject;    //构造函数,注册观察者    public HuBeiTv(Subject subject) {        this.subject = subject;        subject.registerObserver(this);    }    @Override    public void update(int wendu, int shidu, int qiya) {        this.wendu = wendu;        this.shidu = shidu;        this.qiya = qiya;        //报导天气        report();    }    //报导天气    @Override    public void report() {        System.out.println("湖北人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);    }}

◆class MainExec.java(客户端(测试main方法))

package tiglle.pattern.Observer;//客户端(测试main方法)public class MainExec {    public static void main(String[] args) {        //实例化气象站(主题)        WeatherData weatherData = new WeatherData();        //实例化电视台(观察者),并注册进主题        Observer hunanTv = new HuNanTv(weatherData);        Observer hubeiTv = new HuBeiTv(weatherData);        //当气象站(主题)发生变化,电视台(观察者)马上进行报道        weatherData.setWeatherParame(32, 25, 30);        weatherData.setWeatherParame(10, 20, 30);        weatherData.setWeatherParame(50, 60, 70);    }}运行结果:湖南人民注意了,当前温度:32,当前湿度:25,当前气压:30湖北人民注意了,当前温度:32,当前湿度:25,当前气压:30湖南人民注意了,当前温度:10,当前湿度:20,当前气压:30湖北人民注意了,当前温度:10,当前湿度:20,当前气压:30湖南人民注意了,当前温度:50,当前湿度:60,当前气压:70湖北人民注意了,当前温度:50,当前湿度:60,当前气压:70

此时不用改变主题代码,可以随意添加观察者数量

类图:
这里写图片描述