设计模式之【观察者模式】

发布于:2025-07-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

观察者模式中的角色

通过一个简单案例来演示观察者模式

被观察者接口

事件类型

up主类作为被观察者

观察者接口

 粉丝类作为观察者

测试

测试结果


观察者模式中的角色

  • 被观察者(observable)
  • 观察者(observer)

通过一个简单案例来演示观察者模式

被观察者接口

/**
 * 被观察者
 */
public interface Observable {
    /**
     * 添加观察者
     */
    void addObserver(Observer observer);

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

    /**
     * 通知观察者
     */
    void advice(String msg, EventType eventType);
}

事件类型

/**
 * 事件类型
 */
public enum EventType {
    NEW_COMPOSITION(1, "发布了新作品,点击查看新作品"),
    LIVE_BROADCAST(2, "正在直播中,前去观看");

    private final Integer key;
    private final String desc;

    EventType(Integer key, String desc) {
        this.key = key;
        this.desc = desc;
    }

    public Integer getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }
}

up主类作为被观察者

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

/**
 * up主(被观察者)
 */
public class UpOwner implements Observable {
    // 维护一个观察者集合
    private final List<Observer> observers = new ArrayList<>();
    private final Integer id;
    private final String name;

    public UpOwner(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public void addObserver(Observer observer) {
        if (!observers.contains(observer)) {
            observers.add(observer);
        }
    }

    @Override
    public void delObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void advice(String msg, EventType eventType) {
        for (Observer observer : observers) {
            observer.take(msg, eventType);
        }
    }

    /**
     * 发布新作品
     */
    public void uploadComposition() {
        advice(buildMsg(), EventType.NEW_COMPOSITION);
    }

    /**
     * 开始直播
     */
    public void beginLive() {
        advice(buildMsg(), EventType.LIVE_BROADCAST);
    }

    public String buildMsg() {
        return String.format("您关注的up主[%s-%s]", getId(), getName());
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

观察者接口

package sjms.observer;

/**
 * 观察者
 */
public interface Observer {
    /**
     * 被观察者执行的动作会触发该方法
     */
    void take(String msg, EventType eventType);
}

 粉丝类作为观察者

/**
 * 粉丝(观察者)
 */
public class Fan implements Observer {
    private final Integer id;
    private final String name;

    public Fan(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public void take(String msg, EventType eventType) {
        System.out.println(this + "接收到消息:{" + msg + eventType.getDesc() + "}");
    }

    @Override
    public String toString() {
        return "粉丝[" + id + "-" + name + ']';
    }
}

测试

public class MainTest {
    public static void main(String[] args) {
        // up主一
        UpOwner up = new UpOwner(0, "up主一");

        // 粉丝1、粉丝2、粉丝3
        Observer fan1 = new Fan(1, "fan1");
        Observer fan2 = new Fan(2, "fan2");
        Observer fan3 = new Fan(3, "fan3");

        // 粉丝1、粉丝2关注了up主一
        up.addObserver(fan1);
        up.addObserver(fan2);

        // 此时up主一发布一条新作品,粉丝1、粉丝2能收到信息并做出反应,粉丝3并没有关注up主一,所以收不到信息
        up.uploadComposition();

        System.out.println("------显眼的分界线------");

        // 粉丝1取关了up主一
        up.delObserver(fan1);
        // 粉丝3关注了up主一
        up.addObserver(fan3);

        // 此时up主一开启了直播,粉丝2、粉丝3能收到消息并做出反应,粉丝1已经取关了up主一,所以收不到消息
        up.beginLive();
    }
}

测试结果


网站公告

今日签到

点亮在社区的每一天
去签到