设计模式(一) 观察者模式

本文介绍了观察者模式,一种行为型设计模式,用于定义对象间的一对多依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文章详细阐述了模式的角色、结构和简单实现,包括抽象主题、具体主题、抽象观察者和具体观察者的接口及其实现,并提供了Java代码示例。
摘要由CSDN通过智能技术生成

目录

一、观察者模式

1. 观察者模式简介

2. 观察者模式角色介绍

3. 观察者模式结构图

4. 观察者模式简单实现

一、观察者模式

1. 观察者模式简介

观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会被自动通知并且更新。

2. 观察者模式角色介绍

  • 抽象主题(Subject):抽象主题是被观察者对象的接口,接口定义了增加、删除、通知观察者对象等方法。
  • 具体主题 (Concrete Subject):作为抽象主题的实现类,具体主题内部状态发生改变时,会通知其观察者。
  • 抽象观察者 (Obstract Observer):定义了观察者接口,包含了更新方法,当收到主题通知时,会调用此方法。
  • 具体观察者 (Concrete Observer):抽象观察者的具体实现类,收到通知后会更新自身内部状态。 

3. 观察者模式结构图

抽象主题与抽象观察者之间是单向联系,抽象观察者与内部状态对象也是单向联系,这样使得观察者与被观察者之间更加灵活地交换,建立了低耦合的关系。 

4. 观察者模式简单实现

  • 内部状态对象 Event
package BuilderPattern;

/**
 * @create 2023-06-16 {20:16}
 * 用到了建造型模式的思想
 */
public class Event {
    private String event;
    private String name;

    private Event() {}

    private Event(Builder builder) {
        event = builder.event;
        name = builder.name;
    }

    public static class Builder {
        private String event;
        private String name;

        public Builder() {}

        public Builder event(String event) {
            this.event = event;
            return this;
        }

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Event build() {
            return new Event(this);
        }
    }

    public String getEvent() {
        return event;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "事件:" + event + "\n名称:" + name;
    }
}
  • 抽象主题
package ObserverPattern.WasObserver;

import ObserverPattern.Observer.Observer;

/**
 * @create 2023-06-16 {20:34}
 * 抽象主题
 */
public interface Subject {
    public void registerObserver(Observer observer);

    public void removeObserver(Observer observer);

    public void notifyObservers();
}

  • 具体主题
package ObserverPattern.WasObserver;

import BuilderPattern.Event;
import ObserverPattern.Observer.Observer;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * @create 2023-06-16 {20:34}
 * 抽象主题实现类 -- 具体主题
 */
public class EventDataSystem implements Subject {

    private List<Observer> observerList = new ArrayList<Observer>();
    private Event event;
    private static final Logger LOGGER = Logger.getLogger(EventDataSystem.class.getName());

    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer: observerList) {
            observer.update(event);
        }
    }

    public void setEvent(Event event) {
        this.event = event;
        dataChange();
    }

    public void dataChange() {
        LOGGER.info("获取到了最新的数据" + event);
        notifyObservers();
    }
}
  • 抽象观察者
package ObserverPattern.Observer;

import BuilderPattern.Event;

/**
 * @create 2023-06-16 {20:20}
 * 抽象观察者
 */
public interface Observer {
    public void update(Event event);
}

具体观察者

package ObserverPattern.Observer;

import BuilderPattern.Event;

import java.util.logging.Logger;

/**
 * @create 2023-06-16 {20:32}
 */
public class Sina implements Observer {
    private static final Logger LOGGER = Logger.getLogger(Sina.class.getName());
    private Event event;

    @Override
    public void update(Event event) {
        this.event = event;
        display();
    }

    public void display() {
        if (event == null) {
            return;
        }
        LOGGER.info(">>>>>>>>>>>>>新浪网站获取到更新数据,进行更新操作");
        LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
    }
}

// Baidu
package ObserverPattern.Observer;

import BuilderPattern.Event;

import java.util.logging.Logger;

/**
 * @create 2023-06-16 {20:22}
 */
public class Baidu implements Observer {

    private static final Logger LOGGER = Logger.getLogger(Baidu.class.getName());
    private Event event;
    @Override
    public void update(Event event) {
        this.event = event;
        display();
    }

    public void display() {
        if (event == null) {
            return;
        }
        LOGGER.info(">>>>>>>>>>>>>百度网站获取到更新数据,进行更新操作");
        LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
    }
}

// Sina
package ObserverPattern.Observer;

import BuilderPattern.Event;

import java.util.logging.Logger;

/**
 * @create 2023-06-16 {20:32}
 */
public class Sina implements Observer {
    private static final Logger LOGGER = Logger.getLogger(Sina.class.getName());
    private Event event;

    @Override
    public void update(Event event) {
        this.event = event;
        display();
    }

    public void display() {
        if (event == null) {
            return;
        }
        LOGGER.info(">>>>>>>>>>>>>新浪网站获取到更新数据,进行更新操作");
        LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
    }
}

  • 测试用例
package ObserverPattern.TestCase;

import BuilderPattern.Event;
import ObserverPattern.Observer.Baidu;
import ObserverPattern.Observer.Edge;
import ObserverPattern.Observer.Observer;
import ObserverPattern.Observer.Sina;
import ObserverPattern.WasObserver.EventDataSystem;

/**
 * @create 2023-06-16 {21:05}
 */
public class ObserverTest {
    public static void main(String[] args) {
        EventDataSystem eds = new EventDataSystem();
        Event.Builder builder = new Event.Builder();
        eds.registerObserver(new Baidu());
        eds.registerObserver(new Sina());
        eds.setEvent( new Event.Builder()
                .event("四级考试通知")
                .name("6月16日四级考试")
                .build());
        Observer edge = new Edge();
        eds.registerObserver(edge);
        eds.setEvent(new Event.Builder()
                .event("六级考试通知")
                .name("下午进行六级考试")
                .build());
        eds.removeObserver(edge);
        eds.setEvent(builder
                .event("择日正常开放教学楼")
                .name("恢复正常教学")
                .build());
    }
}
  •  运行结果


     上述内容如果有错误的地方,希望大佬们可以指正。我一直在学习的路上,您的帮助使我收获更大!觉得对您有帮助的话,还请点赞支持!我也会不断更新文章!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弘弘弘弘~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值