设计思想与模式之五观察者模式

一 概述

1.什么是观察者模式?

将一个对象视作被观察者,当它发出某种行为或者发生某种变化时,通知所有依赖它的对象(观察者),这种设计模式叫做观察者设计模式。

2.观察者设计模式的用途

用于处理一对多的依赖关系,当一个对象的状态发生改变时,通知所有依赖于它的对象,这些对象收到通知以后采取相应的处理措施。

二 观察者模式构成

  1. 被观察者接口:包含添加观察者、删除观察者、通知观察者等操作。
  2. 被观察者:实现了被观察者接口,一个具体的被观察者。
  3. 观察者接口:处理被观察者的通知。
  4. 观察者:实现了观察者接口,一个具体的观察者。

三 实现Demo

1.被观察者接口

package com.designmode.observer.demo01;

public interface IObserver {

    void handleNotify(String message);

}

2.被观察者

package com.designmode.observer.demo01;

import java.util.ArrayList;
import java.util.List;

public class Performer implements IObservable {

    private List<IObserver> observers;

    public Performer() {
        super();
        observers = new ArrayList<IObserver>();
    }

    @Override
    public void addObserver(IObserver observer) {
        // TODO Auto-generated method stub
        observers.add(observer);
    }

    @Override
    public void removeObserver(IObserver observer) {
        // TODO Auto-generated method stub
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        // TODO Auto-generated method stub
        for (IObserver observer : observers) {
            observer.handleNotify(message);
        }
    }

}

3.观察者接口

package com.designmode.observer.demo01;

public interface IObservable {

    void addObserver(IObserver observer);

    void removeObserver(IObserver observer);

    void notifyObservers(String message);

}

4.观察者一

package com.designmode.observer.demo01;

public class FirstObserver implements IObserver {

    @Override
    public void handleNotify(String message) {
        // TODO Auto-generated method stub
        System.out.println("观察者FirstObserver接收到消息----[" + message + "]----正在处理");
    }

}

5.观察者二

package com.designmode.observer.demo01;

public class SecondObserver implements IObserver {

    @Override
    public void handleNotify(String message) {
        // TODO Auto-generated method stub
        System.out.println("观察者SecondObserver接收到消息----[" + message + "]----正在处理");
    }

}

6.测试类

package com.designmode.observer.demo01;

import org.junit.Test;

public class ObserverTest {

    @Test
    public void test01() {
        /**
         * 创建观察者
         */
        IObserver firstObserver = new FirstObserver();
        IObserver secondObserver = new SecondObserver();

        IObservable performer = new Performer();// 创建被观察者

        /**
         * 添加观察者
         */
        performer.addObserver(firstObserver);
        performer.addObserver(secondObserver);

        performer.notifyObservers("被观察者发生变化");

    }

}
时间: 2024-12-14 18:05:10

设计思想与模式之五观察者模式的相关文章

拦截器的设计思想——代理模式

代理模式:静态代理和动态代理 1.代理类和被代理类必须实现同一个借口 2.代理类和别代理类有一种关联关系 静态代理: 例如实现一个日志: //定义一个接口 public interface UserDao{ public void delete(); } //定义一个实现类 public class UserDaoImpl implements UserDao{ public void delete(){ System.out.pritln("成功删除"); } } //定义一个代理类

设计思想与模式之二适配器模式

1.什么是适配器模式? 适配器模式是一种过渡模式,用于沟通两个不兼容的事物,实现信息交换. 2.适配器模式的目的 使一个对象能够以一种相对简单的方式处理多个不同类型的对象,即一个对象兼容多个不同类型的对象.例如,电脑接收外部硬件的插口唯一确定,不同尺寸的内存卡先插到读卡器上,再由读卡器插到唯一确定的插口上.读卡器就充当了适配器的角色,不同的内存卡拥有不同的读卡器,由于不同的读卡器面对的是相同的插口,因此不同的读卡器拥有共同的特性,在程序中就表现为适配器实现共同的接口,体现了接口的可插拔特性. 3

设计思想与模式之四静态代理模式

一 概述 1.什么是代理模式? 为了隐藏与保护目标对象,为其他对象提供一个代理以控制对该目标对象的访问. 2.什么是静态代理模式? 代理模式有两种: 静态代理:代理对象固定. 动态代理:代理对象不固定. 二 静态代理模式 1.基本结构: 父类:可以是一个接口.抽象类.一般类,一般是接口,保证可以按照操作目标对象的方式操作代理对象. 目标类:实现了父类. 代理类:不仅拥有与目标相同的父类,而且包含目标类对象. 2.代理类包含目标对象的实现 代理模式的作用是隐藏与保护目标对象,因此目标对象不能由用户

设计思想与模式之一模块化

1.什么是模块化 将实现不同功能的代码分别存放到不同的文件.类.方法中,每一个文件.类.方法都是一个实现单一功能的模块. 2.为什么使用模块化 模块化的文件.类.方法功能单一,可以相对独立存在,不仅降低了对其他对象的依赖,而且层次清晰,便于维护. 3.模块化的具体实现方法 通过增加模块数目减小单个文件.类.方法的体积.

2015-03-12---外观模式,建造者模式,观察者模式,boost库应用

今天白天主要看了boost库的应用,主要是常用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式,主要就是外观模式,建造者模式和观察者模式.我们从boost简要说起. 其实boost的库好多东西在c++11里面已经有了,比如bind,只不过boost的库的bind比c++11用着感觉要方便,其实有些东西我自己因为也没有用c++做过什么大的项目,所以不敢乱说,只敢说点建议性的,关于bind就是绑定

框架源码系列一:设计模式(设计思想、设计原则、各种设计模式介绍、设计模式总结)

要分析常用框架spring.mybatis.springboot.springcloud等的源码,首先要了解各种设计模式,因为框架里面应用了各种设计模式 一.设计思想 学习设计模式最重要的是掌握设计思想和设计原则,理解了设计思想和设计原则并运用到平时的编码中是最重要的!!! 1. 我们先来看下面的问题: 天天加班编程,编程到底都做的是什么? 撸代码,加班撸代码,写接口.写类.写方法 用设计模式或做设计的作用是什么? 指导.规定该如何撸代码,如何来写接口.写类.写方法 为什么要做设计.用设计模式?

中文翻译为&quot;具象状态传输&quot;的RESTful的架构风格和设计思想

本文标签:  具象状态传输 RESTful架构 RESTful理解 REST   服务器 REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态.所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计.在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现. REST(Representational State Transfer ),有中文翻译为"具象状态传

Linux/Unix设计思想

Mike Gancarz 1.Unix开发基于Multics分时操作系统 2.NIH(Not invented here,非我发明) 3.GPL:GUN公共授权协议,适用于软件的法律协议.开源 4.Unix哲学: 1)小即是美:易理解.维护.低消耗系统资源.易于其他工具结合 2)让每一个程序制作好一件事 3)尽快建立原型(prototyping):"第三个系统"概念 4)舍高效而取可移植性 5)使用纯文本文件来存储数据:二进制严格禁止 6)充分利用软件的杠杆效应:借用代码模块;将一切自

kafka入门二:Kafka的设计思想、理念

本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做深入介绍,在这里只做较概括的描述以便大家更好的理解Kafka的独特之处.本节主要涉及到如下主要内容: Kafka设计基本思想 Kafka中的数据压缩 Kafka消息转运过程中的可靠性 Kafka集群镜像复制 Kafka 备份机制 一.kafka由来 由于对JMS日常管理的过度开支和传统JMS可扩展性方面的局限,LinkedIn(www.linkedin.com)开发了Kafka以满足他们对实时数据流