java observer观察者

本文通过一个简单的班级通知场景,介绍了观察者模式的应用。通过定义Subject和Student接口,并使用Monitor类来实现Subject,模拟了班长通知学生的上下课行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对观察者比较有兴趣,感觉工作中的用的很多,最典型的就要算dubbo了,zk将提供者或者服务者的信息推送给对方,当然,提供者和消费者都要在zk进行注册,这里以班长通知学生上课下课为原型,简单说一下观察者模式的用法,这是自己的总结,难免有错误和不足,欢迎指正

角色

1.有一个subject,monitor实现subject,班长(monitor)的各项功能,如登记学生,通知上下课

2.有具体的角色,primarystudent实现student,负责对班长通知的上下课事件进行响应

实现

负责定义班长的各项职责

public interface Subject {
   public void addStudent(Student s);
   public void reduceStudent(Student s);
   public void informClassStart();
   public void informClassEnd();
}

负责定义学生收到班长通知后所做动作

public interface Student {
   public void classStart();
   public void classEnd();
}

班长类的具体实现

public class Monitor implements Subject {


    private ArrayList<Student> student ;


    public Monitor() {
        student = new ArrayList<Student>();
    }

添加学生
    public void addStudent(Student s) {
        // TODO Auto-generated method stub
        student.add(s);
    }


移除学生
    public void reduceStudent(Student s) {
        // TODO Auto-generated method stub
        student.remove(s);
    }



循环通知所有学生上课
    public void informClassStart() {
        // TODO Auto-generated method stub
        for (Student s : student) {
            s.classStart();
        }
    }


循环通知所有学生下课
    public void informClassEnd() {
        // TODO Auto-generated method stub
        for (Student s : student) {
            s.classEnd();
        }
    }
}

学生收到班长通知后所触发的动作

public class PrimaryStudent implements Student {

    private String name;

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


  
    public void classStart() {
        System.out.println(this.name + "上课了,好好学习!");
    }


    public void classEnd() {
        System.out.println(this.name + "下课了,好爽!");
    }

}

测试

public class ObserverTest {
    public static void main(String[] args) {
      Monitor m=new Monitor();
      PrimaryStudent koeb=new PrimaryStudent("koeb");
      m.addStudent(koeb);
      m.addStudent(new PrimaryStudent("bryant"));
      m.addStudent(new PrimaryStudent("wede"));
      m.informClassStart();
      System.out.println("---------");
      m.reduceStudent(koeb);
      m.informClassEnd();
    }

}

执行结果

koeb上课了,好好学习!
bryant上课了,好好学习!
wede上课了,好好学习!
---------
bryant下课了,好爽!
wede下课了,好爽


总结

1.看了好多的设计模式,感觉其实总的一点,就是抽象编程,面向接口编程,同时要考虑接口的通用性和可扩展性

2.这个例子中,student在monitor那里注册(add),然后monitor负责在事件发生时向所有注册的student进行通知

3.student收到通知后,执行既有逻辑(如下课事件和上课事件)


最后,都是自己的一点点学习感悟,不喜勿喷,希望大家指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值