Java设计模式之观察者模式

观察者模式也叫发布订阅模式,意思是:定义对象之间一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都得到通知并被自动更新。
观察者模式(发布订阅模式)包含如下角色:

  • 抽象发布者:可以增加、删除、通知订阅者;
  • 具体发布者:抽象发布者方法的具体实现;
  • 抽象订阅者:定义一个接受通知的方法,在得到通知时更新自己的状态;
  • 具体订阅者:抽象订阅者的具体实现。

下面以订阅报纸为例:

public interface INewsPaper {
    //添加订阅者
    void add(IPerson iPerson);
    //删除订阅者
    void remove(IPerson iPerson);
    //通知所有订阅者
    void notifyPersons();
}
public class NewsPaper implements INewsPaper {

    private List<IPerson> personList = new ArrayList<>();

    @Override
    public void add(IPerson iPerson) {
        personList.add(iPerson);
    }

    @Override
    public void remove(IPerson iPerson) {
        personList.remove(iPerson);
    }

    @Override
    public void notifyPersons() {
        for (IPerson person: personList) {
            person.update();
        }
    }
}
public interface IPerson {

    void update();
}

public class Person implements IPerson {
    @Override
    public void update() {
        System.out.println("我收到了通知");
    }
}
public class Test {

    public static void main(String[] args) {
        INewsPaper newsPaper = new NewsPaper();
        IPerson person = new Person();
        newsPaper.add(person);
        newsPaper.notifyPersons();
    }
}
我收到了通知

由上述代码可知,在观察者模式中,发布者并不知道每一个订阅者,它只知道订阅者们的共同接口-抽象订阅者,所以观察者模式容易扩展,符合开闭原则。但是,如果订阅者比较多时,每个通知会比较耗时。

观察者模式的应用场景如下:

  • 关联行为的场景,比如:在一个系统中,如果用户完善了个人资料,就会增加积分、开放更多权限等;
  • 消息队列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章