设计模式之观察者模式

来源:互联网 发布:dnf安图恩数据异常 编辑:程序博客网 时间:2024/06/07 15:42

定义

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。

场景

水质检测。当水质为清澈时,让检测人员进行记录,当水质为轻度污染时,通知预警人员和检测人员,当水质为重度污染时,通知行政人员以及预警人员和检测人员。水质污染的状态发生变化,通知的人员也发生相应的变化,适合用观察者模式。

代码示例

首先定义观察者接口,这里增加了对观察者职务的获取和设置。

package observer;public interface Watcher {    public void setJob(String job);    //获取观察人员的职务    public String getJob();    public void update(Subject subject);}

观察者具体实现类

package observer;public class ConcretWatcher implements Watcher {    private String job;    @Override    public void setJob(String job) {        // TODO 自动生成的方法存根        this.job = job;    }    @Override    public String getJob() {        // TODO 自动生成的方法存根        return job;    }    @Override    public void update(Subject subject) {        System.out.println(getJob() +"得到通知,水质等级是"+subject.getPollutionLevel());    }}

定义目标的父对象,这里使用抽象方法。

package observer;import java.util.List;import java.util.ArrayList;public abstract class Subject {    protected List<Watcher> list = new ArrayList<>();    //获取水质污染等级    public abstract int  getPollutionLevel();    public abstract void notifyWatcher();    public abstract void setPollutionLevel(int level);    public  boolean  attach(Watcher watcher)    {            return list.add(watcher);    }        public  boolean  detach(Watcher watcher{            return list.remove(watcher);    }}

具体的派生类

package observer;import java.util.ArrayList;import java.util.List;public class WaterQuality extends Subject {    private int pollutionLevel = 0;    public int  getPollutionLevel()    {        return pollutionLevel;    }    @Override    public void notifyWatcher() {        // TODO 自动生成的方法存根        for (Watcher watcher:list)        {            if (pollutionLevel  >= 0)            {                if (watcher.getJob().equals("检测人员"))                {                    watcher.update(this);                }            }            if (pollutionLevel >= 1)            {                if (watcher.getJob().equals("预警人员"))                {                    watcher.update(this);                }            }            if (pollutionLevel >= 2)            {                if (watcher.getJob().equals("行政人员"))                {                    watcher.update(this);                }            }        }    }    public void setPollutionLevel(int level) {        this.pollutionLevel = level;            this.notifyWatcher();    }}

客户端的代码

package observer;public class Client {    public static void main(String[] args)    {        Subject subject = new WaterQuality();        Watcher watcher1 =  new ConcretWatcher();        watcher1.setJob("检测人员");        Watcher watcher2 = new ConcretWatcher();        watcher2.setJob("预警人员");        Watcher watcher3 =  new ConcretWatcher();        watcher3.setJob("行政人员");        subject.attach(watcher1);        subject.attach(watcher2);        subject.attach(watcher3);        System.out.println("当水为清澈的时候:");        subject.setPollutionLevel(0);        System.out.println("当水为轻度污染时:");        subject.setPollutionLevel(1);        System.out.println("当水为重度污染时:");        subject.setPollutionLevel(2);    }}

运行结果:
当水为清澈的时候:
检测人员得到通知,水质等级是0
当水为轻度污染时:
检测人员得到通知,水质等级是1
预警人员得到通知,水质等级是1
当水为重度污染时:
检测人员得到通知,水质等级是2
预警人员得到通知,水质等级是2
行政人员得到通知,水质等级是2

原创粉丝点击