Java常用设计模式——观察者模式

观察者模式又叫做发布-订阅-模式、模型-视图-模式、源-监听器-模式或者从属者模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己,它是一种行为型模式

观察者模式所涉及的角色有:

  • 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色
  • 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色 
  • 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口
  • 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用

定义抽象主题角色

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 */
public interface Subject {
    /**
     * 添加观察者对象
     *
     * @param observer
     */
    public void addObserver(Observer observer);

    /**
     * 移除观察者对象
     *
     * @param observer
     */
    public void removeObserver(Observer observer);

    /**
     * 更新观察者对象信息
     */
    public void notifyObservers();
}

定义具体主题角色

package com.observerpattern;

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

/**
 * @author yyx 2017年10月10日
 */
public class ConcreteSubject implements Subject {
    private List<Observer> observerList = new ArrayList<Observer>();

    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.update();
        }
    }

}

定义抽象观察者角色

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 抽象观察者角色
 */
public interface Observer {
    public void update();
}

定义具体观察者角色

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 具体观察者角色
 */
public class ConcreteObserverFirst implements Observer {

    @Override
    public void update() {
        System.out.println("我是第一个实现Observer接口的类");
    }
}

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 * 具体观察者角色
 */
public class ConcreteObserverSecond implements Observer {

    @Override
    public void update() {
        System.out.println("我是第二个实现Observer接口的类");
    }

}

定义测试类

package com.observerpattern;

/**
 * @author yyx 2017年10月10日
 */
public class PatternTest {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer observerFirst = new ConcreteObserverFirst();
        Observer observerSecond = new ConcreteObserverSecond();
        subject.addObserver(observerFirst);
        subject.addObserver(observerSecond);
        subject.notifyObservers();
    }
}
运行结果:        我是第一个实现Observer接口的类        我是第二个实现Observer接口的类

原文地址:https://www.cnblogs.com/xianya/p/9194726.html

时间: 2024-10-12 02:30:04

Java常用设计模式——观察者模式的相关文章

java常用设计模式-观察者模式

观察者模式: 设计到的角色: 主题:是一个接口,同时必须包含一个观察者列表,必须有添加,删除,通知观察者的方法 具体主题:主题的实现类 观察者:也是接口,接口中需要定义接到通知之后的操作 具体观察者:观察者的实现类,同时观察者要订阅主题则需要注册,即必须要添加到主题的观察者列表中,取消订阅则是删除 当主题的状态发生变化的时候,所有的观察者都得到通知 主题: package com.design2; public interface SubjectInterface { void add(Obse

java常用设计模式之 工厂模式

工厂模式: 定义 一个用于创建对象的接口,让子类决定实例化哪一个类. 一句话概括: 是一个类的实例化延迟到其子类.     适用于 以下情况: ①:当一个类 ,不知道它所必须创建的对象的类的时候. ②:当一个类,希望由它的子类来指定它所创建的对象的时候. ③:当类将创建对象的职责给多个帮助子类中的一个,并且希望将哪一个帮助子类是代理这一信息局部化的时候. 说明: ① Product :定义工厂方法所创建的对象的接口. ② ConcreteProduct:实现Product 接口. ③ Creat

java常用设计模式(一)单例模式

第一次写博客,也是第一篇,从单例模式开始,不足之处,望各位看官海涵. 简介 首先我们都知道单例模式是java常用的23种设计模式之一,它的用途可谓是非常广泛.它的核心就在于单实例,即整个环境中该类有且只能有一个对象.而java创建实例的方式已知的有四种,分别是通过new.clone.反射或者序列化这四种方式去创建实例,怎样保证单例呢,下面且听我一一道来. 单例模式的常见写法: 1.基础饿汉式单例 优点: 类加载时就去初始化,没有线程安全问题,不能通过new创建实例 缺点: ①.能通过反射或者序列

java常用设计模式

一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我所理解的"简单"就是一把钥匙开一把锁的模式, 目的仅仅是着眼于解决现在的问题,而设计模式的"复杂"就在于它是要构造一个"万能钥匙",目的是提出一种对所有锁的开锁方案. 在真正理解设计模式之前我一直在编写"简单"的代码.这个&quo

JAVA常用设计模式整理

设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写“简单”的代码.这个“简单”不是功能的简单,而是设计的简单.简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的项目中

java常用设计模式链接

转自:作者:dreamOwn     https://www.cnblogs.com/wabi87547568/p/5280905.html Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 总之,选择单例模式就是为了避免不一致状态,避免政出多头. 推荐链接:http://blog.csdn.net/

java常用设计模式-单例模式

java设计模式系列之单例模式 单例模式定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式作用 简单来说,就是在整个程序运行的生命期中,任何一个时刻,单例类的实例都只有一个(当然也可以一个都没有). 如何保证对象的唯一性 思想:(1)不让其他程序创建该类对象: (2)在本类中创建该类对象: (3)创建一个对外提供的方法,可以让其他类进行调用. 步骤:(1)因为创建对象的时候都要初始化构造函数,将该类的构造函数私有化,其他程序就无法再创建该类对象: (2)就是在本类中创建本类对

IOS常用设计模式——观察者模式(IOS开发)

观察者模式(Observer)也叫发布/订阅模式(Publish/Subscribe) - 问题: 在软件设计中,经常需要对一个对象的状态改变,从而引起很多对象的状态发生改变.这个特点很明显,复用性强,而且对象之间匿名通信.观察者模式最为适合. - 原理: 举个例子: 包括四个角色: 1.抽象主题(subject).是个协议,是一个观察者集合容器,定义了添加,移除和对所有观察者发送通知(分别对应attach/detach/notifyObserver三个方法). 2.抽象观察者(Observer

For Exam (Java常用设计模式) 介绍

一 创建型模式 工厂模式(Factory): 定义一个用以创建对象的接口 抽象工厂模式(Abstract Factory): 提供一个创建一系列相关或相互依赖对象的接口 单例模式(Singleton): 保证一个类仅有一个实例,并提供一个访问它的全局控制点. 建造者模式(Builder): 将一个复杂对象的构建与它的表示分离. 二 结构型模式 适配器模式(Adapter): 将一个类的接口转换成客户希望的另一个接口. 合成模式(Composite): 合成模式将对象组合成树型结构以表示“部分--