欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【代码简述设计模式】----- 观察者模式

程序员文章站 2022-04-29 18:50:49
什么是观察者模式  观察者模式:定义对象之间的一对多依赖,当一个对象的改变状态时,它的依赖者都会收到通知并自动更新。这里就用报社、人来分析,如果有人想看报纸就可以向报社订阅,如果已经订阅的人不想看报纸可以向报社注销,而对于报社而言,它只会把报纸发给订阅的人群,这里的报社就是观察者模式中的主 ......

什么是观察者模式

 观察者模式:定义对象之间的一对多依赖,当一个对象的改变状态时,它的依赖者都会收到通知并自动更新。这里就用报社、人来分析,如果有人想看报纸就可以向报社订阅,如果已经订阅的人不想看报纸可以向报社注销,而对于报社而言,它只会把报纸发给订阅的人群,这里的报社就是观察者模式中的主题(subject),人就是观察者(observer),观察者向主题注册自己就可以在主题改变时收到通知。

观察者模式uml图

【代码简述设计模式】----- 观察者模式

代码实现

/**
 * 观察者模式的主题,用于注册、移除、通知观察者
 */
public interface subject {
    /**
     * 新增观察者
     */
    void registerobserver(observer observer);

    /**
     * 移除观察者
     */
    void removeobserver(observer observer);

    /**
     * 通知观察者
     */
    void notifyobserver(string newspapername);
}

/**
 * 观察者接口类
 */
public interface observer {

    /**
     * 被通知时做的操作
     */
    void update(string newspapername);

}

 上面时观察者模式的两个核心类,下面时具体的应用,首先是主题实现类-newspaperoffice,observerlist 保存所有的观察者,

import java.util.arraylist;
import java.util.list;

public class newspaperoffice  implements subject{

    private list<observer> observerlist = new arraylist<>();

    @override
    public void registerobserver(observer observer) {
        observerlist.add(observer);
    }

    @override
    public void removeobserver(observer observer) {
        observerlist.remove(observer);
    }

    /**
     * 通知观察者们
     */
    @override
    public void notifyobserver(string newspapername) {
        observerlist.foreach((b) -> b.update(newspapername));
    }

}

 这里是具体的观察者,也就是被通知的对象

/**
 * 观察者a
 */
public class customera implements observer{

    private subject subject;

    public customera(subject subject) {
        this.subject = subject;
        subject.registerobserver(this);
    }

    @override
    public void update(string newspapername) {
        system.out.println("customera:《" + newspapername + "》发布了");
    }

}


/**
 * 观察者b
 */
public class customerb implements observer {

    private subject subject;

    public customerb(subject subject) {
        this.subject = subject;
        subject.registerobserver(this);
    }

    @override
    public void update(string newspapername) {
        system.out.println("customerb:《" + newspapername + "》发布了");
    }

}

 测试上面写的简易观察者模式实现

public class observertest {
    public static void main(string[] args) {
        subject subject = new newspaperoffice();
        new customera(subject);
        // 注册观察者b
        new customerb(subject);
        // 通知观察者们
        subject.notifyobserver("日报a");
        system.out.println("========================================");
        subject.notifyobserver("日报b");
    }
}

 测试结果
【代码简述设计模式】----- 观察者模式

总结

 从上面的例子分析,主题和观察则都是接口,主题通过接口通知依赖它的所有观察者做某个操作(广播通信),只要知道具体对象的列表,而不需要知道某个具体的对象,上面例子newspaperoffice只需拥有observer数组,至于具体的某个observer并不关注,降低了对象之间的耦合度,这里也是设计原则"针对接口编程,不针对实现编程"的体现。