JAVA 设计模式—————— 观察者模式

本文详细介绍了JAVA中的观察者模式,包括模式定义、特点、结构与实现、优缺点以及具体应用实例,如人民币汇率变化对公司影响和学校铃声事件处理。此外,还讨论了JAVA内置的Observable类和Observer接口在实现观察者模式中的应用。
摘要由CSDN通过智能技术生成

学习 Netty 前的准备工作!!

这里,先来复习一下 OOP(面向对象)的七大原则

  • 开闭原则:对扩展开放,对修改关闭
  • 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
  • 依赖倒置原则:要面向接口编程,不要面向实现编程
  • 单一职责原则:要控制类的粒度大小,将对象解耦,提高其内聚性
  • 接口隔离原则:要为各个类创建它们需要的专用接口
  • 迪米特法则:只与你的直接朋友交谈,不跟陌生人说话
  • 合成复用原则:尽量先使用或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

1、模式的定义与特点

观察者(Observer)模式的定义:指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布 - 订阅模式、模型 - 视图模式,它是对象行为型模式。

观察者模式是一种对象行为模式,其主要优点如下:

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
  • 当观察者对象很多的时候,通知的发布会花费很多的时间,影响程序的效率。

它的主要缺点如下:

  • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
  • 当观察者对象很多的时候,通知的发布会花费很多时间,影响程序的效率。

2、观察者模式的结构与实现

实现观察者模式的时候要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。

2.1、观察者模式的主要角色如下:

  • 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用户保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  • 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变的时候,通知所有注册过的观察者对象。
  • 抽象观察者(Observer)角色:它是一个接口或者抽象类,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知的时候被调用。
  • 具体观察者(Concrete Observer)角色:它实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知的时候更新自身的状态。

观察者模式的结构图如所示:
ILR59K.gif
模式的实现

/**
 * @author wcc
 * @date 2021/11/20 17:09
 * 观察者模式
 */
public class ObserverPattern {
   

    public static void main(String[] args) {
   

        Subject subject = new ConcreteSubject();

        Observer observer1 = new ConcreteObserver1();
        Observer observer2 = new ConcreteObserver2();

        subject.add(observer1);
        subject.add(observer2);

        subject.notifyAllObserver();

    }

}

// 抽象目标类
abstract class Subject {
   
    // 用于保存观察者对象的聚集类对象
    protected List<Observer> observers = new ArrayList<>();

    // 增加观察者对象方法
    public void add(Observer observer){
   
        observers.add(observer);
    }

    // 删除观察者对象方法
    public void remove(Observer observer){
   
        observers.remove(observer);
    }

    // 通知观察者对象方法
    public abstract void notifyAllObserver();
}

// 具体目标类
class ConcreteSubject extends Subject {
   

    @Override
    public void notifyAllObserver() {
   
        System.out.println("具体目标发生改变...");
        System.out.println("=========================");
        for (Observer observer : observers){
   
            observer.response();
        }
    }

}

// 抽象观察者类
interface Observer {
   
    void response();
}

// 具体观察者1类
class ConcreteObserver1 implements Observer {
   

    @Override
    public void response() {
   
        System.out.println("具体观察者1做出反应");
    }

}

// 具体观察者2类
class ConcreteObserver2 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值