Java设计模式-观察者模式

一、观察者模式基础

1.什么是观察者模式

观察者模式,也叫发布订阅模式,此种模式通常被用来实现事件处理系统。

观察者模式包含两个概念,一个可观察的主题对象(Subject),一个或多个的观察者(Observer)。或者叫一个消息发布者,多个消息订阅者。

2.观察者模式组成

观察者模式中有四个角色:

  • Subject  抽象主题、抽象被观察者
  • Concrete Subject  具体主题、具体被观察者
  • Observer  抽象观察者
  • Concrete Observer  具体观察者

它们的关系如下图

3.各个角色的作用

  • Subject 抽象主题接口定义,供主题发布者实现

  • Observer 抽象观察者接口定义,供具体观察者实现

  • Concrete Subject 提供通知观察者的方法、新增和移除观察者的方法

  • Concrete Observer 提供接口,当主题发布消息时,调用此接口实现具体业务

       

二、模拟观察者模式代码实现

1.新建Subject主题类

package subjectAndObserver;

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

/**
 * 抽象主题者/消息发布者
 * */
public class Subject {

    private final List<ObserverService> observerList = new ArrayList<>(10);

    /**
     * 通知观察者
     * */
    public void notifyObservers(Object message) {
        observerList.forEach(observerService -> observerService.doThing(message));
    }

    /**
     * 添加观察者
     * */
    public void add(ObserverService observer) {
        observerList.add(observer);
    }

    /**
     * 移除观察者
     * */
    public void remove(ObserverService observer) {
        observerList.remove(observer);
    }

}

2.新建Subject主题具体的实现

package subjectAndObserver;

/**
 * 抽象主题者/消息发布者实现类
 * */
public class SubjectService extends Subject{

    /**
     * 发布消息
     * */
    public void sendMessage(String message){
        notifyObservers(message);
    }

}

3.新建Observer抽象观察者类

package subjectAndObserver;

/**
 * 抽象观察者/消息订阅者
 * */
public interface ObserverService {

    /**
     * 当主题变化时,调用此接口,实现业务
     * */
    void doThing(Object message);

}

4.新建Observer具体观察者实现类

package subjectAndObserver;

/**
 * 抽象观察者/消息订阅者具体实现类
 * */
public class ObserverServiceImpl implements ObserverService{
    private String name;

    public ObserverServiceImpl(String name) {
        this.name = name;
    }

    /**
     * 当主题变化时,调用此接口,实现业务
     * */
    @Override
    public void doThing(Object message) {
        System.out.println(name + "收到主题发布的消息:" + message + ", 去做某业务");
    }

}

5.测试运行

package subjectAndObserver;

public class SubjectAndObserverTest {
    public static void main(String[] args) {
        SubjectService subject = new SubjectService();
        ObserverService observerA = new ObserverServiceImpl("A观察者");
        ObserverService observerB = new ObserverServiceImpl("B观察者");
        subject.add(observerA);
        subject.add(observerB);
        System.out.println("观察者和主体的关系建立完成,等待接收主题的消息");
        
        //模拟抽象主题者/消息发布者,发布消息
        subject.sendMessage(" 发布商品 ");
        subject.sendMessage(" 降价 ");
    }
}

运行结果

=========================================================================创作不易,请勿直接盗用,使用请标明转载出处。

喜欢的话,一键三连,您的支持是我一直坚持高质量创作的原动力。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值