观察者模式

来源:互联网 发布:ping优化 编辑:程序博客网 时间:2024/06/09 16:48

观察者模式的定义

定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,

所有依赖它的对象都得到通知并被自动更新。

推模型

目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象

的全部或部分数据。

两种模型做个比较

推模型是假定目标对象知道观察者需要的数据

拉模型是目标对象不知道观察者具体需要什么数据,因此把自身传给

观察者,由观察者取值。

拉模型案例,把天气情况通知给观察者。

/** * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 */public class Subject {    //用来保存注册的观察者对象    private List<Observer> observers=new ArrayList<>();    public void attach(Observer observer){        observers.add(observer);    }    /**     * 删除集合中的指定观察者     * @param observer     */    public void detach(Observer observer){        observers.remove(observer);    }    /**     * 通知所有注册的观察者对象     */    protected void notifyObservers(){        for(Observer observer:observers){            observer.update(this);        }    }}
/** * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 */public class ConcreteSubject extends Subject {    //目标对象的状态    private String subjectState;    public String getSubjectState() {        return subjectState;    }    public void setSubjectState(String subjectState) {        this.subjectState = subjectState;        this.notifyObservers();    }}
/** * 这是一个观察者接口,定义更新的接口 * 给那些在目标发生变化的时候被通知的对象 */public interface Observer {    /**     * 更新的接口     * 传入目标对象,方便获取相应的目标对象的状态     * @param subject     */    void update(Subject subject);}
/** * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直 */public class ConcreteObserver implements Observer {    //观察者的状态    private String observerState;    private String name;    private String event;    /**     * 获取目标类的状态同步到观察者的状态中     * @param subject     */    @Override    public void update(Subject subject) {        observerState=((ConcreteSubject)subject).getSubjectState();        System.out.println(name+"收到了,"+observerState);        System.out.println("他要去"+event);    }    public String getEvent() {        return event;    }    public void setEvent(String event) {        this.event = event;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
public class Test {    public static void main(String[] args){        //1创建目标        ConcreteSubject weather=new ConcreteSubject();        //2创建观察者        ConcreteObserver girlfriend=new ConcreteObserver();        girlfriend.setName("女朋友");        girlfriend.setEvent("去约会");        ConcreteObserver mum=new ConcreteObserver();        mum.setName("老妈");        mum.setEvent("逛街去");        //3注册观察者        weather.attach(girlfriend);        weather.attach(mum);        //4目标发布天气        weather.setSubjectState("明天天气多云,气温28度。");    }}
推模型:

/** * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 */public class Subject {    //用来保存注册的观察者对象    private List<Observer> observers=new ArrayList<>();    public void attach(Observer observer){        observers.add(observer);    }    /**     * 删除集合中的指定观察者     * @param observer     */    public void detach(Observer observer){        observers.remove(observer);    }    /**     * 通知所有注册的观察者对象     */    protected void notifyObservers(String content){        for(Observer observer:observers){            observer.update(content);        }    }}
/** * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 */public class ConcreteSubject extends Subject {    //目标对象的状态    private String subjectState;    public String getSubjectState() {        return subjectState;    }    public void setSubjectState(String subjectState) {        this.subjectState = subjectState;        this.notifyObservers(subjectState);    }}
/** * 这是一个观察者接口,定义更新的接口 * 给那些在目标发生变化的时候被通知的对象 */public interface Observer {    /**     * 更新的接口     * 传入目标对象,方便获取相应的目标对象的状态     *     */    void update(String content);}
/** * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直 */public class ConcreteObserver implements Observer {    //观察者的状态    private String observerState;    private String name;    private String event;    /**     * 获取目标类的状态同步到观察者的状态中     *     */    @Override    public void update(String content) {        observerState=content;        //observerState=((ConcreteSubject)subject).getSubjectState();        System.out.println(name+"收到了,"+observerState);        System.out.println("他要去"+event);    }    public String getEvent() {        return event;    }    public void setEvent(String event) {        this.event = event;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
public class Test {    public static void main(String[] args){        //1创建目标        ConcreteSubject weather=new ConcreteSubject();        //2创建观察者        ConcreteObserver girlfriend=new ConcreteObserver();        girlfriend.setName("女朋友");        girlfriend.setEvent("去约会");        ConcreteObserver mum=new ConcreteObserver();        mum.setName("老妈");        mum.setEvent("逛街去");        //3注册观察者        weather.attach(girlfriend);        weather.attach(mum);        //4目标发布天气        weather.setSubjectState("明天天气多云,气温28度。");    }}

0 0
原创粉丝点击