观察者模式

定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。类似发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息

四种角色:抽象被观察者角色  抽象观察者角色  具体被观察者角色  具体观察者角色

 

小Demo走一波

 

1、定义Observer

public interface Observer {

    public void notify(String info);
}

2、定义Observer实现

复制代码
public class ObserverImpl implements Observer{

    private SubjectImpl subject;
    private String observerName;
    
    //注册感兴趣的subject
    public ObserverImpl(SubjectImpl subject, String observerName) {
        this.subject = subject;
        this.observerName = observerName;
        subject.register(this);
    }

    //打印接收到消息
    @Override
    public void notify(String info) {
        System.out.println("observer " + this.observerName + " receive data: " + info);
    }

}
复制代码

 

3、定义Subject

复制代码
public interface Subject {

    /**
     * register observer
     */
    public void register(Observer obj);
    
    /**
     * remove observer
     */
    public void remove(Observer obj);
    
    public void notifyIfObserverChange();
    
}
复制代码

 

4、subject实现

 

复制代码
public class SubjectImpl implements Subject{

    private ArrayList<Observer> observerList = new ArrayList<Observer>();
    private String info;
    
    @Override
    public void register(Observer obj) {
        observerList.add(obj);
    }

    @Override
    public void remove(Observer obj) {
        int i = observerList.indexOf(obj);
        if(i > 0)
            observerList.remove(i);
    }

    @Override
    public void notifyIfObserverChange() {
        for (int i = 0, len = observerList.size(); i < len; i++) {
            Observer instance = (Observer)observerList.get(i);
            instance.notify(info);
        }
    }

    public void setWork(String _info) {
        this.info = _info;
        System.out.println("send data: " + info);
        this.notifyIfObserverChange();
    }
}
复制代码

 

 

5、测试

复制代码
public class Main {

    public static void main(String[] args) {
        
        SubjectImpl sub = new SubjectImpl();
        new ObserverImpl(sub, "t1");
        new ObserverImpl(sub, "t2");
        new ObserverImpl(sub, "t3");
        
        sub.setWork("123");
    }
}
复制代码

 

posted @   秋水秋色  阅读(180)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示