23种设计模式(3)——观察者模式

观察者模式:观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 

package com.cjian.GOF;

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

/**
 * @description: 观察者模式 
 * @author: CJ
 * @time: 2020/12/16 15:16
 */
public class ObserverDemo {
    public static void main(String[] args) {
        Subjecter subjecter = new Subjecter();
        Observer1 o1 = new Observer1();
        Observer2 o2 = new Observer2();
        //添加观察者
        subjecter.addObserver(o1);
        subjecter.addObserver(o2);
        //通知观察者
        subjecter.notifyObserver("我发布了一个消息");
        //移除一个观察者
        subjecter.removeObserver(o1);
        //再次通知观察者
        subjecter.notifyObserver("我又发布了一个消息");

    }

}

//主题
interface Subject {
    void addObserver(Observer observer);

    void notifyObserver(String msg);

    void removeObserver(Observer observer);
}

//主题的实现
class Subjecter implements Subject {

    private static List<Observer> observerlist = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        observerlist.add(observer);
    }

    @Override
    public void notifyObserver(String msg) {
        for (Observer ob : observerlist) {
            ob.doSomeThing(msg);
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        observerlist.remove(observer);
    }
}
//订阅者
interface Observer {
    void doSomeThing(String msg);
}
//订阅者的实现
class Observer1 implements Observer {
    @Override
    public void doSomeThing(String msg) {
        System.out.println("观察者1接到了通知:"+msg);
    }
}

class Observer2 implements Observer {
    @Override
    public void doSomeThing(String msg) {
        System.out.println("观察者2接到了消息:"+msg);
    }
}

 输出:

 

jdk中的Observable(主题)、Observer(观察者)类以及Spring的时间驱动ApplicationListener都采用了观察者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值