java设计模式之观察者模式

来源:互联网 发布:飞机上座率查询软件 编辑:程序博客网 时间:2024/06/05 14:21

1、观察者模式介绍:
涉及到被观察者和观察者,当被观察者的状态发生改变的时候,会通知观察者,观察者在接收到事件后做出响应。(你是被观察者,你老婆是观察者,如果你偷喝酒被发现了,你老婆就会打你。)

2、以员工请求老板加工资为例,来理解观察者模式。其中员工是被观察者,老板是观察者

员工的接口:

package observer;/** * 员工的接口 *  * @author Administrator */public interface Subject{    public void registerObserver(Observer o);    public void removeObserver(Observer o);    public void notifyObservers();}

员工的实现类:

package observer;/** * 具体的员工 */import java.util.ArrayList;import java.util.List;public class ConcreteSubject implements Subject{    private final List<Observer> observers;    private float temperature;    public float getTemperature()    {        return temperature;    }    private void temperatureChanged()    {        // 开始通知        System.out.println("我是员工,我开始通知老板我要加工资");        this.notifyObservers();    }    public void setTemperature(final float temperature)    {        this.temperature = temperature;        System.out.println("我是员工,我想加工资");        this.temperatureChanged();    }    public ConcreteSubject()    {        System.out.println("我是员工");        observers = new ArrayList<Observer>();    }    @Override    public void registerObserver(final Observer o)    {        observers.add(o);        System.out.println("我是员工,我新增了一个老板");    }    @Override    public void removeObserver(final Observer o)    {        if (observers.indexOf(o) >= 0)        {            observers.remove(o);        }    }    @Override    public void notifyObservers()    {        System.out.println("我是员工,我开始问我的老板,我要加工资");        if (observers.isEmpty())        {            System.out.println("=============你没有老板,加不了工资=================");        }        for (final Observer o : observers)        {            o.update(temperature);        }    }}

老板的接口:

package observer;/** * 老板的接口 *  * @author Administrator */public interface Observer{    public void update(float temprature);}

老板的实现类:

package observer;/** * 老板 *  * @author Administrator */public class ConcreteObserver implements Observer{    private float temperature;    private final Subject subject;    public ConcreteObserver(final Subject subject)    {        System.out.println("我是老板");        this.subject = subject;        this.subject.registerObserver(this);    }    public float getTemperature()    {        return temperature;    }    public void setTemperature(final float temperature)    {        this.temperature = temperature;    }    @Override    public void update(final float temperature)    {        this.temperature = temperature;        System.out.println("我是老板,收到你加工资的请求,同意!");    }}

主程序:

package observer;public class Client{    public static void main(final String[] args)    {        // 创建了一个员工        final ConcreteSubject sb = new ConcreteSubject();        // 调用员工的set方法        sb.setTemperature((float)20.00);        // 创建一个该老板管理的员工,向该老板的员工集合中添加该员工        final Observer o = new ConcreteObserver(sb);        // 调用员工的setTemperature方法        sb.setTemperature((float)21.00);    }}

运行结果如图:

这里写图片描述

原创粉丝点击