设计模式 - 观察者模式

本文介绍了观察者模式,一种通过降低对象间耦合度,实现状态变化时自动通知订阅者的编程设计模式。讨论了其优点如依赖倒转和目标-观察者机制,以及缺点如潜在的循环引用和性能开销。核心内容包括抽象主题、具体主题、观察者接口及应用实例,如博主和读者订阅系统。
摘要由CSDN通过智能技术生成

定义:

多个对象间存在 一对多的 依赖关系,对象状态发生变化时,所有依赖于它的 对象收到通知,并自动更新;
也叫:发布订阅模式

优缺点

优点:

  1. 降低了对象间的耦合度,属于抽象耦合关系- 依赖倒转
  2. 目标和观察者之间,会建立触发机制

缺点:

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

主要组成结构

抽象目标(抽象主题)
具体目标(具体主题)
抽象观察者
具体观察者

应用实例

订阅-发布

读者订阅某个博主,博主发布文章,读者就会收到
消息队列… …

类图

观察者模式(博主、读者).jpg

代码实现

/**
 * 读者 订阅 博主
 * 博主发新文章,推送给 读者
 */

abstract class Blogger{

    List<Reader> readerList = new ArrayList<>();

    void addReader(Reader reader){
        System.out.println(reader.toString()+"订阅了博主");
        readerList.add(reader);
    }

    void removeReader(Reader reader){
        System.out.println(reader.toString()+"退订了博主");
        readerList.remove(reader);
    }

    /**
     * 写文章
     */
    abstract void write();

}

class Ming extends Blogger{

    /**
     * 写文章
     */
    @Override
    void write() {
        System.out.println("博主写了新文章");
        readerList.forEach(Reader::read);
    }
}

interface Reader{

    void read();

}
class ReaderA implements Reader{

    @Override
    public void read() {
        System.out.println("ReaderA 收到了博主的新文章");
    }
}
class ReaderB implements Reader{

    @Override
    public void read() {
        System.out.println("ReaderB 收到了博主的新文章");
    }
}

/**
 * 观察者模式
 *
 * @author yufw
 */
public class ObserverPattern {

    public static void main(String[] args) {

        Reader readerA = new ReaderA();
        Reader readerB = new ReaderB();
        Blogger blogger = new Ming();
        blogger.addReader(readerA);
        blogger.addReader(readerB);
        blogger.write();

    }
}

结果

com.beauty.designpatterns.behavior.ReaderA@58372a00订阅了博主
com.beauty.designpatterns.behavior.ReaderB@4dd8dc3订阅了博主
博主写了新文章
ReaderA 收到了博主的新文章
ReaderB 收到了博主的新文章
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值