`

《设计模式》之十五:观察者模式

阅读更多

Observer Pattern 观察者模式也叫发布/订阅(Publish/Subscribe)模式,它是一个在项目中经常使用的模式。

其定义如下:

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

 

观察者模式的几个角色名称:

1,Subject被观察者

定义被观察者必须实现的职责,它必须能够动态增加、删除观察者,它一般是抽象类或实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者

 

2,Observer观察者

观察者接受到消息后,立即进行update,对接受的信息进行处理

 

3,ConcreteSubject具体的被观察者

定义被观察者自己的业务逻辑,同时定义对那些事件进行通知

 

4,ConcreteObserver具体观察者

 

通用模板代码:

public interface Observer {
    // 更新方法
    public void update();
}

 

public class ConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("接受到消息,并处理中...");
    }
}

 

public abstract class Subject {
    // 定义一个观察者数组
    private Vector<Observer> observers = new Vector<Observer>();

    // 增加一个观察者
    public void addObserver(Observer o) {
        this.observers.add(o);
    }

    // 删除一个观察者
    public void delObserver(Observer o) {
        this.observers.remove(o);
    }

    // 通知所有观察者
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update();
        }
    }
}

 

public class ConcreteSubject extends Subject {
    // 具体业务逻辑
    public void doSomething() {
        // do something...
        System.out.println("I do something...");
        super.notifyObservers();
    }
}

 

public class Client {
    public static void main(String[] args) {
        // 创建一个被观察者
        ConcreteSubject subject = new ConcreteSubject();
        // 定义一个观察者
        Observer obs = new ConcreteObserver();
        // 添加观察者
        subject.addObserver(obs);
        // 开始活动
        subject.doSomething();
    }
}

 

观察者模式的优点:

1,观察者和被观察者之间是抽象耦合的

如此则不管是增加观察者还是增加被观察者都非常容易扩展,而且在Java中都已经实现的抽象层的定义,在系统扩展方面更是得心应手。

2,建立一套除非机制

 

观察者模式的缺点:

观察者模式需要考虑一下开放效率和运行效率问题,一个被观察者,多个观察者,开放和调试就比较复杂。Java中消息通知模式是顺序执行,这种情况下,一般采用异步方式的消息通知机制。

多级触发的效率更是让人担忧。这时候要注意啦啦

 

观察者模式使用场景:

1,关联行为场景。注意的是,关联行为是可拆分的,而不是组合关系。

2,事件多级触发场景

3,扩系统的消息交换场景,如消息队列的处理机制

 

注意事项:

广播链的问题:

只要注意一点,根据经验建议,一个观察者模式中最多出现一个对象既是观察者又是被观察者,也就是说消息最多转发一次(传递两次)。

 

异步处理问题:

有多个观察者的时候,如果观察者处理时间较长就要使用异步方式,那这个时候就得考虑线程安全和队列的问题,这时候可以参考下Message Queue就有更深入的理解。

 

观察者模式的扩展模式:

在JDK中已经给我们提供了现成的Observable和Observer两个类,之间使用即可大大简化上面的代码:
这时候已经不需要抽象的Subject和自己定义的Observer类了:

public class ConcreteSubject extends Observable {
    // 具体业务逻辑
    public void doSomething() {
        // do something...
        System.out.println("I do something...");
        super.setChanged();
        super.notifyObservers();
    }
}

 

public class ConcreteObserver implements java.util.Observer {

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("---哈哈,我在使用JDK里面的Observer接受到消息---");
    }
}

 

项目中真实的观察者模式:

1,观察者和被观察者之间的消息沟通

一般做法是:观察者中的update方法有两个参数,一个是被观察者,一个是DTO,DTO是一个纯洁的JavaBean,由被观察者生产,由观察者消费。 从JDK的Observer接口即可看出来。

如果考虑远程传输,一般消息格式以XML或者JSON格式传递。

 

2,观察者响应方式:

一般来讲是启动多线程去通知观察者

 

3,被观察者尽量自己做主

被观察者状态改变是否一定要通知观察者呢?不一定的这个,一般对被观察者的业务逻辑doSomething方法实现重载,如增加一个doSomething(boolean isNotifyObs)方法,决定是否通知观察者,而不是在消息到达观察者时才判断要不要处理这个消息。

 

最佳实践:

观察者模式在实践项目和生活中经常出现,举几个例子说明:

1,文件系统

一个目录小新建一个文件,会同时通知目录管理器增加一个目录,并通知磁盘管理器减少1K空间

2,广播收音机

电台在广播,你可以打开两个收音机来收听,电台就是被观察者,收音机就是观察者。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    设计模式之观察者模式

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

    设计模式:观察者模式java和javabean

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

    设计模式-观察者模式(讲解及其实现代码)

    总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    Qt设计模式之观察者模式

    本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    Unity3D设计模式之观察者模式

    ### Unity3D设计模式之观察者模式 #### 观察者模式概述 观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式之一。它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它...

    软件设计模式:观察者模式.zip

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到通知。 观察者模式...

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

Global site tag (gtag.js) - Google Analytics