Home Archives Categories Tags

设计模式之第19章-观察者模式(Java实现)

发布时间: 更新时间: 总字数:1463 阅读时间:3m 作者: 分享

Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

引子

狗仔队其实嘛,也就是所谓进行监视观察活动,接下来就让观察者来给我们讲讲观察者与设计模式不得不说的那些个事儿。

观察者模式介绍

额就四(我就是)观察者,也被称作依赖或者发布订阅,是在项目中经常用到的一种模式。定义如下:Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.翻译过来就是说:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者的通用类图如下:

观察者模式分析

首先来说下好处:

  • 支持广播通信。
  • 目标和观察者之间抽象耦合。

接着是缺点部分:

  • 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
  • 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
  • 另外多级触发的效率也需要考虑到。

观察者模式之实现

至于实现那么就以“贱人曽”来举个栗子吧。就拿曾小贤来举栗子(贤哥,我不是有意的,不要怪我撒,我知道你是LOLer,打得还不错),首先是被观察者Observable,就是名人,比如说曽大大,习大大,Linus大大等等:

public interface Obeservable{
    //增加观察者
    public void addObserver(Observer observer);
    //删除观察者
    public void deleteObserver(Observer observer);
    //发生改变通知观察者
    public void notifyObservers(String context);
}

这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:

public class ZengXiaoXian implements IZengXiaoXian,Obserable{
    //定义动态数组存放不同媒体的狗仔队
    private ArrayList<Observer> observerList = new ArrayList<>();
    //增加观察者
    public void addObserver(Observer observer){
        this.observerList.add(observer);
    }
    //删除观察者
    public void deleteObserver(Observer observer){
        this.observerList.remove(observer);
    }
    //发生改变通知观察者
    public void notifyObservers(String context){
        for (Observer observer : observerList ) {
            observer.update(context);
        }
    }
    //吃饭
    public void eat(){
        System.out.println("曾小贤要吃饭了");
        this.notifyObservers("曾小贤要吃饭了");
    }
    //睡觉
    public void sleep(){
        System.out.println("曾小贤要睡觉了");
        this.notifyObservers("曾小贤要睡觉了");
    }
    //玩
    public void play(){
        System.out.println("曾小贤要玩耍了");
        this.notifyObservers("曾小贤要玩耍了");
    }
}

被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:

public interface Observer{
    //发现被观察的人有动静,就开始准备写稿子,整头条什么的
    public void update(String context);
}

然后就是狗仔队的实现了,狗仔队一号出动:

public class Paparazzo1 implements Observer{
    //狗仔队一号一旦发现有什么爆料,就告诉老板
    public void update(String str){
        System.out.println("观察到曾小贤和张子萱拥吻,开始汇报");
        this.reportToXX(str);
    }
    //汇报给XX媒体
    private void reportToXX(String context){
        System.out.println("老大,我看到"+context);
    }
}

如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:

public class Client{
    public static void main(String[] args) {
        //出来一个狗仔队
        Observer paparazzo = new Paparazzo();

        //曾小贤出场
        ZengXiaoXian zengxiaoxian = new ZengXiaoXian();
        zengxiaoxian.addObserver(paparazzo);

        //看看曾小贤在干嘛
        zengxiaoxian.eat();
        zengxiaoxian.play();
        zengxiaoxian.sleep();
    }
}

观察者模式之应用场景

  • 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
  • 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

完毕。

最新评论
加载中...