再看观察者模式Observer

来源:互联网 发布:创世网络宣传片 编辑:程序博客网 时间:2024/05/17 02:29
什么是观察者模式?
    定义:观察者模式,定义了对象之间的一对多的依赖关系,当被观察者发生改变时,所有依赖被观察者的对象,都会被通知,并且做出相应的
改变。
    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听
者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察
者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常
被用来实现事件处理系统。

下面的例子以博客网站发布博客为例,当一个用户发布博客时,所有关注这个博主的用户,都会收到这篇博客。

第一步:定义一个观察者接口:ObserverModelInterface

package com;/** *  * @author yangcq * @description 观察者模式 -- 观察者接口 * */public interface ObserverModelInterface {    public void update();}

第二步:具体的观察者,实现ObserverModelInterface接口,这里我们定义2个实现类,这2个实现类,可以看做是2个观察者。

package com;/** *  * @author yangcq * @description 观察者模式 -- 观察者接口实现类 * */public class ObserverModelImpl_A implements ObserverModelInterface{    public void update() {        System.out.println("A刷新了博客列表,看到了《J2EE规范》这篇文章");    }    }

package com;/** *  * @author yangcq * @description 观察者模式 -- 观察者接口实现类 * */public class ObserverModelImpl_B implements ObserverModelInterface{    public void update() {        System.out.println("B刷新了博客列表,看到了《J2EE规范》这篇文章");    }    }

第三步:定义被观察者抽象类:ObserverModelSubject

package com;import java.util.Vector;/** *  * @author yangcq * @description 观察者模式 -- 被观察者抽象类 * */public abstract class ObserverModelSubject {    // Vector是线程安全的,所以这里使用Vector,而不是List    private Vector<ObserverModelInterface> omi = new Vector<ObserverModelInterface>();    // 添加观察者    public void addObserver(ObserverModelInterface omi){        this.omi.add(omi);    }    // 移除观察者    public void delObserver(ObserverModelInterface omi){        this.omi.remove(omi);    }    // 通知Vector中所有的观察者    protected void notifyAllObserver(){        for(ObserverModelInterface oberver:omi){            oberver.update();        }    }    // 抽象方法,由实现类来实现具体的细节    public abstract void doSomething();}

第四步:被观察者的实现类:ObserverModelSubjectImpl

package com;/** *  * @author yangcq * @description 观察者模式 -- 观察者接口实现类 * */public class ObserverModelSubjectImpl extends ObserverModelSubject{    @Override    public void doSomething() {        System.out.println("yangcq发表了一篇博客,名字叫:《J2EE规范》");        this.notifyAllObserver();    }}

ok,这样一个简单的观察者模式的实现,就写好了,接下来,我们测试一下,看看效果:

package com;/** *  * @author yangcq * @description 观察者模式 -- 测试类 * */public class ObserverModelDemo {    // 观察者模式,一共有四个角色:观察者接口、观察者实现类、被观察者抽象类、被观察者实现类    // 1,观察者接口 ObserverModelInterface    //     这个接口定义了一个方法 update(),当被观察者发生改变时,会调用观察者的update方法;    // 2,观察者实现类 ObserverModelImpl_A 和 ObserverModelImpl_B    //     如果观察者数量较多,就会有较多的实现类    // 3,被观察者抽象类 ObserverModelSubject    //     这个类是关键,定义了三个方法普通方法和一个抽象方法    // 4,被观察者实现类 ObserverModelSubjectImpl    //     这个实现类主要实现doSomething()方法的细节    public static void main(String[] args){        ObserverModelSubject oms = new ObserverModelSubjectImpl();        // 添加观察者列表        oms.addObserver(new ObserverModelImpl_A());        oms.addObserver(new ObserverModelImpl_B());        oms.doSomething();                /**         * 控制台输出:         *          * yangcq发表了一篇博客,名字叫:《J2EE规范》         * A刷新了博客列表,看到了《J2EE规范》这篇文章         * B刷新了博客列表,看到了《J2EE规范》这篇文章         */    }}


0 0
原创粉丝点击