设计模式之观察者模式

目录

观察者模式概念

观察者模式的基本概念

Subject(主题)

Observer(观察者)

Subject(主题)

Observer(观察者)

ConcreteSubject(具体主题)

ConcreteObserver(具体观察者)

举个栗子:

4.代码实现

1)Observer观察者类

2)Subject主题类

3)Student类

4)teacher类

5)观察者测试类

6)测试结果

附录:

1)23种设计模式讲解地址

2)23种设计模式源码下载地址:


观察者模式概念

        它允许一个对象(称为“主题”或“被观察者”)在其状态发生变化时通知多个观察者对象,从而实现对象之间的解耦。这种模式常用于实现事件处理机制和发布/订阅模式。


观察者模式的基本概念


Subject(主题)

         主题也称为被观察者,负责维护一个观察者列表,并在状态发生变化时通知所有观察者。


Observer(观察者)


        观察者负责监听主题的状态变化,并在收到通知时更新自己。
观察者模式的主要组成部分


Subject(主题)


        维护一个观察者列表。
        提供注册和注销观察者的方法。
        提供通知观察者的方法。


Observer(观察者)


        定义一个更新的方法,当主题状态发生变化时被调用。


ConcreteSubject(具体主题)


        实现Subject接口,维护一个观察者列表,并在状态发生变化时通知所有观察者。


ConcreteObserver(具体观察者)


        实现Observer接口,定义具体的更新逻辑。

举个栗子:

        老师想通知学生明天老师不上课,老师找到班长把这个消息给班长说了一下,班长接着通知班里的每个学生。

流程

学生进入老师班级==>老师通知班长消息==>班长通知每个学生

主要部分:

  1. 老师:这是订阅者模式的发布者,它负责发布消息。
  2. 学生集合:这是订阅者模式的订阅者集合,它包含了所有订阅了老师消息的学生。
  3. 小久:这是订阅者模式的订阅者,它订阅了老师的消息。
  4. 张三:这是订阅者模式的订阅者,它订阅了老师的消息。
  5. 惜己:这是订阅者模式的订阅者,它订阅了老师的消息。

通过这种方式,订阅者模式允许对象在状态改变时通知其他对象,从而实现对象之间的松耦合。

4.代码实现

1)Observer观察者类

        Observer 是一个接口,用于定义订阅者的行为。
        getMessage 方法接收一个 Teacher 对象作为参数,并表示接受消息。
简单来说,这个接口定义了订阅者的基本行为,即接收来自教师的消息。

package org.xiji.observer2;

/**
 * 订阅者类
 */
public interface Observer {
    /**
     *
     * 接受消息
     */
    void getMessage(Teacher teacher);
}

2)Subject主题类

        接口定义:定义了一个 Subject2 接口,用于管理观察者的注册、移除和通知。


        方法定义:
                register(Student student):注册一个观察者(学生)。
                remove(Student student):移除一个观察者(学生)。
                notifyStudent():通知所有已注册的观察者(学生)。

package org.xiji.observer2;

/**
 * 发布者类
 */
public interface Subject2 {

    /**
     * 注册
     */
    void register(Student student);

    /**
     * 移除
     */
    void remove(Student student);

    /**
     * 通知
     */
    void notifyStudent();

}

3)Student类

        Student 类实现了 Observer 接口,表示学生可以接收消息。
        成员变量 name 存储学生的姓名。
        构造方法和访问器方法用于初始化和获取学生的姓名。
        getMessage 方法接收一个 Teacher 对象,并打印一条消息表示学生接收到教师的通知。


        简单来说,这个类定义了一个学生,能够接收来自教师的消息,并打印出通知的内容。

package org.xiji.observer2;

public class Student implements Observer{
    private String name;

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

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * 接受老师的消息
     *
     */

    @Override
    public void getMessage(Teacher teacher) {
        System.out.println(name + "接到通知:" + teacher.getMessage());
    }
}

4)teacher类

        类定义:定义了一个具体实现类 Teacher,实现了 Subject2 接口。
        成员变量:
                message:存储要发布的消息。
                students:存储已注册的学生列表。
        构造方法:
                默认构造方法。
                带参数的构造方法。
        方法实现:
                getMessage:获取当前的消息。
                setMessage:修改消息,并自动通知所有已注册的学生。
                register:注册一个学生,并打印注册成功的提示。
                remove:移除一个学生。
                notifyStudent:通知所有已注册的学生。

package org.xiji.observer2;

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

/**
 * 教师发布消息
 */
public class Teacher implements Subject2 {
    /**
     * 通知消息
     */
    private String message;
    /**
     * 班级学生集合
     */
    private List<Student> students=new ArrayList<>();

    public Teacher() {
    }

    public Teacher(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 修改订阅信息
     *
     */
    public void setMessage(String message) {
        this.message = message;
        //通知学生
        this.notifyStudent();
    }


    @Override
    public void register(Student student) {
        students.add(student);
        System.out.println("学生:"+student.getName()+"注册成功");
    }

    @Override
    public void remove(Student student) {
        students.remove(student);

    }

    /**
     * 这个方法相当于班长通知学生
     */
    @Override
    public void notifyStudent() {
        /**
         * 通知每个学生
         */
        for (Student student : students) {
            student.getMessage(this);
        }

    }
}

5)观察者测试类

        类定义:定义了一个 Observer2Main 类,用于测试观察者模式的实现。
        创建对象:创建一个 Teacher 对象 teacher。
        注册学生:创建三个学生对象 student1、student2 和 student3,并将它们注册到教师对象中。
        输入消息:使用 Scanner 类从控制台读取用户输入的消息,并通过 setMessage 方法更新消息并通知所有已注册的学生。

package org.xiji.observer2;

import java.util.Scanner;

/**
 * 订阅者模式
 */
public class Observer2Main {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();

        Student student1 = new Student("小久");
        Student student2 = new Student("张三");
        Student student3 = new Student("惜己");

        teacher.register(student1);
        teacher.register(student2);
        teacher.register(student3);

        //创建io流
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入通知内容:");
            String message = scanner.nextLine();
            teacher.setMessage(message);

        }


    }
}

6)测试结果

附录:

1)23种设计模式讲解地址

23种设计模式讲解地址

专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html


 设计模式之访问者模式地址:  https://blog.csdn.net/2301_76862031/article/details/141716629

 设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
 设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304

设计模式之备忘录模式地址:     https://blog.csdn.net/2301_76862031/article/details/141678153
 
 设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
 
 设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
 
 设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
 
 设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
 
 设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
 
 设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
 
 设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
 
 设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
 
 设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019

设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
 
 设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
 
 设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704

 设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
 
 设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
 
 设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
 
 设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
 
 设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
 
 设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953
 

2)23种设计模式源码下载地址:

java23种设计模式的实现代码(): 23种设计模式的实现使用java,并且均已经通过测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值