观察者设计模式

 


前言:

  从现实角度来说,我们每一个人都是一个观察者,同时也是一个被观察者。

  作为被观察;者,我们会发出一些信息,观察者在接收到这些信息后,会做出相应的反映;而作为观察者,我们是可以被“被观察者”所发出的信息影响的。

  一个被观察者,可能存在多个观察者。也就是说,一个被观察者所发出的信息,可能会影响到多个观察者。

  观察者设计模式:

    定义了一种一对多的关联关系。一个对象A与多个对象B、C、D之间建立“被观察与观察关系”。

    当对象A的状态发生改变时,通知所有观察者对象B、C. D。当观察者对象B、c、D在接收到A的通知后,根据自身实际情况,做出相应改变。

    当然,观察者与被观察者指的都是具有某一类功能的对象、

结构说明:

 

 代码:

IObserved:

public interface IObserved {
    /**
     * 接收数据信息
     * @param demo
     */
    void shuJu(String demo);
}

IBeObserved:

复制代码
public interface IBeObserved {
    /**
     * 添加观察者的方法
     * @param observed
     */
    void addObserved(IObserved observed);

    /**
     * 删除观察者的方法
     * @param observed
     */
    void removeObserved(IObserved observed);

    /**
     * 向观察者发送消息的方法
     * @param data
     */
    void sendObserved(String data);
}
复制代码

OneBeserved:

public class OneObserved implements IObserved {
    @Override
    public void shuJu(String demo) {
        System.out.println("一号观察者正在处理信息:" + demo);
    }
}

TwoBeserved:

public class TwoObserved implements IObserved {
    @Override
    public void shuJu(String demo) {
        System.out.println("二号观察者正在处理信息:" + demo);
    }
}

BeObserverSimp:

复制代码
public class BeObserverSimp implements IBeObserved {
    /**
     * 定义观察者集合/
     */
    List<IObserved> list;

    public BeObserverSimp() {
        //在被观察者创建的时候,就创建观察者集合
        list = new ArrayList<>();
    }

    @Override
    public void addObserved(IObserved observed) {
        list.add(observed);
    }

    @Override
    public void removeObserved(IObserved observed) {
        list.remove(observed);
    }

    @Override
    public void sendObserved(String data) {
        //遍历集合调用每个观察者中的方法
        for (IObserved observed : list) {
            observed.shuJu(data);
        }
    }
}
复制代码

测试类:

复制代码
/**
 * @author zhangzhixi
 */
public class Test {
    public static void main(String[] args) {
        //创建观察者
        OneObserved one = new OneObserved();
        TwoObserved two = new TwoObserved();
        //创建被观察者
        BeObserverSimp bos = new BeObserverSimp();
        //添加一号跟二号观察者
        bos.addObserved(one);
        bos.addObserved(two);
        //删除一号观察者
        bos.removeObserved(one);
        //向观察发送消息
        bos.sendObserved("你好世界!");
    }
}
复制代码

测试结果:

 

posted @   Java小白的搬砖路  阅读(143)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示