java 观察者模式(三)Subject 和 Observer 实现

一 前言

根据前两篇内容大概了解了观察者模式的应用,但是 applicationContext 的使用是基于 spring 的事件机制, 这篇主要介绍一下其他实现观察者模式的方法,如使用 Subject 和 Observer.
先说理论, 再上代码
使用 Subject 和 Observer, 主要需要了解他有四个角色

  1. subject 抽象主题类:
    1.1 需要包含一个 列表属性,用来保存观察者
    1.2 要有两个虚方法,用来增加和删除观察者
    1.3 要有一个待实现方法,由具体抽象类来分别实现
  2. ConcreteSubject 具体主题类:
    实现抽象主题类,重写抽象主题类中的待实现方法,遍历抽象主题类中的观察者列表,调用观察者响应方法
  3. Observer 抽象观察者类:
    一个接口类,包含一个观察者响应的方法
  4. ConcreteObserver 具体观察者类:
    4.1 实现抽象观察者类
    4.2 重写抽象观察者类中的响应方法
    至此四个角色介绍完成,把这四个角色落实,再写一个 client 类测试即可,在 client 测试类中需要将观察者注册到观察者列表中。

二 代码实现

抽象主题类:

public abstract class Subject {

  protected List<Observer> observerList = new ArrayList<Observer>();

  /**
   * 增加观察者
   * @param observer 观察者
   */
  public void add(Observer observer) {
    observerList.add(observer);
  }

  /**
   * 注销观察者,从观察者集合中删除一个观察者
   * @param observer 观察者
   */
  public void remove(Observer observer) {
    observerList.remove(observer);
  }

  /**通知观察者*/
  public abstract void notifyObserver();
}

具体主题类:

public class ConcreteSubject extends Subject {

  @Override
  public void notifyObserver() {
    System.out.println("遍历观察者:");
    for (Observer observer : observerList) {
      observer.response();
    }
  }
}

抽象观察者类:

public interface Observer {
  void response();
}

具体观察者类, 观察者可以有多个,对应不同的处理,这里写两个

public class ConcreteObserver1 implements Observer{
  @Override
  public void response() {
    System.out.println("我是具体观察者ConcreteObserver1");
  }
}

public class ConcreteObserver2 implements Observer{
  @Override
  public void response() {
    System.out.println("我是具体观察者ConcreteObserver2");
  }
}

到这,功能代码完成,再写测试代码:

public class Client {
  public static void main(String[] args) {
    Subject concreteSubject = new ConcreteSubject();
    //具体观察者
    Observer concreteObserver1 = new ConcreteObserver1();
    Observer concreteObserver2 = new ConcreteObserver2();
    concreteSubject.add(concreteObserver1);
    concreteSubject.add(concreteObserver2);

    concreteSubject.notifyObserver();
  }
}

运行测试代码:

遍历观察者:
我是具体观察者ConcreteObserver1
我是具体观察者ConcreteObserver2

发现通知完成,要注意的是,需要在测试代码中,将观察者注册到主题中,才可以接到该主题的通知。

三 总结

从测试代码上看,优点是主题不需要知道观察者的处理,一定程度保证了松耦合,有新观察者时可以直接实现抽象主题类即可,也符合开闭原则,缺点是主题需要知道所有观察者并将观察者注册进来才能通知。
这是又一种观察者模式的实现方式,可以根据项目需求选择不同实现方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并自动更新。在 Java 中,观察者模式可以通过接口实现,以下是一个简单的实现示例: ```java // 主题接口 interface Subject { void registerObserver(Observer observer); // 注册观察者 void removeObserver(Observer observer); // 移除观察者 void notifyObservers(); // 通知所有观察者 } // 观察者接口 interface Observer { void update(); // 更新方法 } // 具体主题类 class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 具体观察者类 class ConcreteObserver implements Observer { private Subject subject; public ConcreteObserver(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update() { // 处理更新通知 } } ``` 在这个示例中,`Subject` 接口定义了注册、移除和通知观察者的方法,`Observer` 接口定义了更新方法,具体的主题和观察者类实现了这些接口。通过使用这些接口,我们可以实现简单的观察者模式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值