观察者模式

——拷打、折磨,毫无人性的酷刑,制服了他的身体,却没有征服他的意志。无论何时,他都坚持着自己的信念,那个他写在绝笔中的信念,那个崇高、光辉、唯一的信念:涟即身无完骨,尸供蛆蚁,原所甘心。但愿国家强固,圣德刚明,海内长享太平之福。此痴愚念头,至死不改。有人曾质问我,遍读史书如你,所见皆为帝王将相之家谱,有何意义?千年之下,可有一人,不求家财万贯,不求出将入相,不求青史留名,唯以天下、以国家、以百姓为任,甘受屈辱,甘受折磨,视死如归?我答:曾有一人,不求钱财,不求富贵,不求青史留名,有慨然雄浑之气,万刃加身不改之志。杨涟,千年之下,终究不朽!

嗯,缅怀一下古人(来自明朝那些事儿,有气节的人总是让人敬佩的).看下今天的观察者模式吧,观察者模式在应用中好像也经常使用吧.额,比如应用APP商城下载东西的时候,APP详情页和APP应用页下载进度要同步,这需要观察者,群聊也可以用到观察者模式等.先来看张图片

观察者模式是一个被观察对象,多个观察者,观察者观察对象需要注册对象,注册后不观察的话需要反注册,即注销,我们在这举个例子说明下.现在小学生去上学报道的时候,要填写家长的手机号码,用来接收平时一些学校的通知,布置作业监督做作业之类的东西,这里面,学校或者班级就是一个被观察的对象,学生的家长就是观察者,报道登记号码,就是注册.等你毕业了或离开那个班级了,就是反注册,注销.嗯,大概就是这样,我们来看看具体实现例子,首选来看看观察者是什么样子

public interface Observer { //观察者

    void updata(String msg);  //自由发挥想象
}

然后,我们来实例化两个观察者,即家长

public class XiaoMingObserver implements Observer{ //小明他妈妈

    @Override
    public void updata(String msg) {
        // TODO Auto-generated method stub
        System.out.println("小明妈妈手机收到短信 : "+msg);
    } 

}



public class XiaoHuaObserver implements Observer{ //小华他妈妈

    @Override
    public void updata(String msg) {
        // TODO Auto-generated method stub
        System.out.println("小华妈妈手机收到短信 : "+msg);
    } 

}

接着,我们来看看我们被观察的对象学校

public class Subject { //被观察对象,我们这简单点不需要复用.不把它写成抽象类或接口

    //用来管理观察这个对象的观察者
    ArrayList<Observer> observerList = new ArrayList<Observer>();

    //注册观察者,观察需要注册
    public void registerObserVer(Observer observer){

        observerList.add(observer);
    }

    //注销观察者,观察者不观察了
    public void unRegisterObserver(Observer observer){
        observerList.remove(observer);
    }

    //通知观察者,对象发生了什么变化
    public void notifyObserver(String str){

        for (Observer ob : observerList) {

            ob.updata(str);         //
        }
    }


}

好了,接着来测试一把

public class main {

    /** * @param args */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Subject subject = new Subject();

        subject.registerObserVer(new XiaoMingObserver());    //小明入学注册
        subject.registerObserVer(new XiaoHuaObserver());     //小华入学注册

        subject.notifyObserver("星期天补课!!"); //学校发通知
    }

}

输出

小明妈妈手机收到短信  :   星期天补课!!
小华妈妈手机收到短信  :   星期天补课!!

观察者模式差不多就这样了,不观察的时候就注销,也挺好理解吧

你可能感兴趣的:(设计模式,观察者模式)