观察者模式

Posted fengyumeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

老板约谈

  大家好,我叫小赵,目前在藏剑山庄任职高级铸剑师,我们的铸剑团队分为17个小组,高级铸剑师就是其中的小组长,小组长的主要工作就是管理小组的项目进度,并且处理一些剑农无法解决的技术问题。

 

  记得有一次,我们一伙七八个小组长闲得蛋疼,围在一起唠嗑,唠着唠着不知道是谁从裤兜里掏了一副扑克牌出来,大伙沉默了一分钟,经过小声的交流确认之后,瞬间撸起袖子直接开干!

 

  打牌的代码以省略号代替.......

 

只见控制台不断的输出信息:

老王:三带一。
老李:炸!报单!
老王:我炸!报单!
老李:王炸!
老王:我草!
......

 

  三天后,老王被老板约谈。原因是那天老板来车间巡视,听到老王大叫一声 "草泥马!"。

 

通风报信的秘书

  后来,老王去买通了老板身边的秘书,那个秘书在我印象中是个十足十的冰山美人,没想到老王确实有一套。

  从此以后,只要老板要来车间,秘书就悄悄打个电话过来报信。

 

类图:

技术图片

观察者抽象:

public interface IObserver {
    void update(String str);//行动
}

 

秘书:

public class Secretary implements IObserver {
    @Override
    public void update(String str) {
        System.out.println("秘书:老王!"+str);
    }
}

 

被观察者抽象:

public interface IBoss {
    void coming();//老板来了
}

 

老板:

public class Boss implements IBoss {
    //老板身边的秘书
    IObserver observer = new Secretary();
    @Override
    public void coming() {
        System.out.println("老板走到门口...");
        observer.update("老板来了!");
    }
}

 

主函数:

    public static void main(String[] args) {
        Boss boss = new Boss();
        boss.coming();
    }

 

输出:

老板走到门口...
秘书:老王!老板来了!

 

多一个眼线,多一份平安

  不久后,老王又被老板叫去办公室喝茶了,原因是有几天秘书身体不适没上班,以至于老王的真面目又一次被老板看到了,场面一度尴尬。

 

  老王平安回来之后,大伙开了个紧急会议,为了避免万无一失,一名观察者是不够的!

 

  老李去搞定人事部小美,老刘去搞定公司前台小玲。

 

大伙商定之后,我迅速开始做设计,画下类图:

技术图片

观察者抽象:

public interface IObserver {
    void update(String str);//行动
}

 

秘书:

public class Secretary implements IObserver {
    @Override
    public void update(String str) {
        System.out.println("秘书:老王!"+str);
    }
}

 

小美:

public class XiaoMei implements IObserver {
    @Override
    public void update(String str) {
        System.out.println("小美:老李!"+str);
    }
}

 

小玲:

public class XiaoLing implements IObserver {
    @Override
    public void update(String str) {
        System.out.println("小玲:老刘!"+str);
    }
}

 

老板行为抽象:

public interface IBoss {
    void coming();//老板来了
}

 

被观察者的管理抽象:

public interface IObservable {
    void add(IObserver observer);//增加观察者
    void delete(IObserver observer);//删除观察者
    void notifyObservers(String message);//通知观察者
}

 

老板:

public class Boss implements IBoss,IObservable {
    //老板身边的观察者
    private ArrayList<IObserver> observers = new ArrayList<>();

    @Override
    public void coming() {
        System.out.println("老板走到门口...");
        this.notifyObservers("老板来了!");
    }

    @Override
    public void add(IObserver observer) {
        this.observers.add(observer);//增加一个观察者
    }

    @Override
    public void delete(IObserver observer) {
        this.observers.remove(observer);//删除一个观察者
    }

    @Override
    public void notifyObservers(String message) {
        for(IObserver observer : this.observers){
            observer.update(message);//给观察者发信息
        }
    }
}

 

主函数:

    public static void main(String[] args) {
        //三个观察者
        IObserver secretary = new Secretary();
        IObserver xiaoMei = new XiaoMei();
        IObserver xiaoLing = new XiaoLing();

        //老板
        Boss boss = new Boss();

        //三个观察者在观察老板
        boss.add(secretary);
        boss.add(xiaoMei);
        boss.add(xiaoLing);

        //老板来了
        boss.coming();
    }

 

输出:

老板走到门口...
秘书:老王!老板来了!
小美:老李!老板来了!
小玲:老刘!老板来了!

 

观察者模式

  观察者模式又叫发布订阅模式。

 

  观察者定义了一种一对多的依赖关系,多个观察者同时监听一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象。

 

  使用场景:当一个对象的改变需要同时改变其他对象的时候,优先考虑观察者模式。

 

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式