前语

目前正在出一个规划形式专题系列教程, 篇幅会较多, 喜欢的话,给个重视❤️ ~

本节给咱们讲一下规划形式中的观察者形式,并结合实践业务场景给咱们讲解如何运用~

本专题的一切案例代码主要以Java言语为主, 好了, 废话不多说直接开整吧~

观察者形式

观察者形式是一种规划形式,用于在目标间树立一对多的依靠关系,使得一个目标的状况发生变化时,其一切依靠目标都会收到告知并自动更新。这种形式包含了两种类型的目标:主题(Subject)观察者(Observer)。主题目标会在状况发生变化时告知一切注册的观察者目标,观察者接受到告知后会自动更新自己。

首要,咱们界说主题接口Subject和观察者接口Observer

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}
public interface Observer {
    void update(int value);
}

接下来,咱们界说一个详细的主题类CounterSubject,它完成了Subject接口,并包含了计数器的值和一个Observer列表。这个类在计数器变化时会告知一切注册的观察者:

public class CounterSubject implements Subject {
    private int value;
    private ArrayList<Observer> observers;
    public CounterSubject() {
        observers = new ArrayList<Observer>();
    }
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(value);
        }
    }
    public void setValue(int newValue) {
        value = newValue;
        notifyObservers();
    }
    public int getValue() {
        return value;
    }
}

最终,咱们界说了一个详细的观察者类CounterObserver,它完成了Observer接口,并在主题状况发生变化时更新自己:

public class CounterObserver implements Observer {
    private int value;
    public void update(int value) {
        this.value = value;
        System.out.println("CounterObserver: Value changed to " + value);
    }
}

现在咱们能够运用这些类来创立一个简略的观察者形式示例。首要,咱们创立一个CounterSubject实例,并注册两个CounterObserver实例:

public class ObserverDemo {
    public static void main(String[] args) {
        CounterSubject subject = new CounterSubject();
        CounterObserver observer1 = new CounterObserver();
        CounterObserver observer2 = new CounterObserver();
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.setValue(10); // Output: CounterObserver: Value changed to 10
        subject.setValue(20); // Output: CounterObserver: Value changed to 20
    }
}

最佳实践

当电商渠道上新商品或促销活动时,可能会有许多用户需求收到告知,并在他们的页面上看到这些新商品或促销活动。这时,咱们能够运用观察者形式来完成这个功用。在这种情况下,主题是电商渠道,观察者是用户。

首要,咱们界说主题接口Subject和观察者接口Observer

public interface Observer {
    void update(String message);
}
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

然后,咱们界说一个详细的主题类EcommercePlatform,它完成了Subject接口,并包含了用户的列表。这个类在有新商品或促销活动时会告知一切注册的观察者:

public class EcommercePlatform implements Subject {
    private ArrayList<Observer> observers;
    public EcommercePlatform() {
        observers = new ArrayList<Observer>();
    }
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    public void notifyUsers(String message) {
        notifyObservers(message);
    }
}

最终,咱们界说一个详细的观察者类User,它完成了Observer接口,并在主题状况发生变化时更新自己:

public class User implements Observer {
    private String name;
    public User(String name) {
        this.name = name;
    }
    public void update(String message) {
        System.out.println("User " + name + " received message: " + message);
    }
}

现在咱们能够运用这些类来创立一个简略的观察者形式示例。首要,咱们创立一个EcommercePlatform实例,并注册两个User实例:

public class Demo {
    public static void main(String[] args) {
        EcommercePlatform ecommercePlatform = new EcommercePlatform();
        User user1 = new User("小明");
        User user2 = new User("小红");
        ecommercePlatform.registerObserver(user1);
        ecommercePlatform.registerObserver(user2);
        ecommercePlatform.notifyUsers("New products on sale!");
//        User 小明 received message: New products on sale!
//        User 小红 received message: New products on sale!
    }
}

在实践应用中,观察者形式能够用于构建更杂乱的体系,例如消息推送和实时数据更新等。

结束语

规划形式其实并不难,咱们在学习的时候一定要在了解的基础上去写代码,不要去背代码。下节给咱们讲状况形式~

本着把自己知道的都告知咱们,假如本文对您有所帮助,点赞+重视鼓舞一下呗~

相关文章

  • 一起来学规划形式之认识规划形式
  • 一起来学规划形式之单例形式
  • 一起来学规划形式之工厂形式
  • 一起来学规划形式之制作者形式
  • 一起来学规划形式之原型形式
  • 一起来学规划形式之适配器形式
  • 一起来学规划形式之桥接形式
  • 一起来学规划形式之组合形式
  • 一起来学规划形式之装饰器形式
  • 一起来学规划形式之外观形式
  • 一起来学规划形式之享元形式
  • 一起来学规划形式之代理形式
  • 一起来学规划形式之责任链形式
  • 一起来学规划形式之指令形式
  • 一起来学规划形式之解说器形式
  • 一起来学规划形式之迭代器形式
  • 一起来学规划形式之中介者形式
  • 一起来学规划形式之备忘录形式

项目源码(源码已更新 欢迎star⭐️)

  • java-design-mode-all: https://github.com/qiuChengleiy/java-design-mode-all

Kafka 专题学习

  • 一起来学kafka之Kafka集群搭建
  • 一起来学kafka之整合SpringBoot根本运用
  • 一起来学kafka之整合SpringBoot深化运用(一)
  • 一起来学kafka之整合SpringBoot深化运用(二)
  • 一起来学kafka之整合SpringBoot深化运用(三)

项目源码(源码已更新 欢迎star⭐️)

  • springboot-kafka-all: https://github.com/qiuChengleiy/springboot-kafka-all

ElasticSearch 专题学习

  • 利用docker搭建es集群

  • 一起来学ElasticSearch(一)

  • 一起来学ElasticSearch(二)

  • 一起来学ElasticSearch(三)

  • 一起来学ElasticSearch(四)

  • 一起来学ElasticSearch(五)

  • 一起来学ElasticSearch(六)

  • 一起来学ElasticSearch(七)

  • 一起来学ElasticSearch(八)

  • 一起来学ElasticSearch(九)

  • 一起来学ElasticSearch(十)

  • 一起来学ElasticSearch之整合SpringBoot(一)

  • 一起来学ElasticSearch之整合SpringBoot(二)

  • 一起来学ElasticSearch之整合SpringBoot(三)

项目源码(源码已更新 欢迎star⭐️)

  • springboot-es-all: https://github.com/qiuChengleiy/springboot-es-all

往期并发编程内容引荐

  • Java多线程专题之线程与进程概述
  • Java多线程专题之线程类和接口入门
  • Java多线程专题之进阶学习Thread(含源码分析)
  • Java多线程专题之Callable、Future与FutureTask(含源码分析)
  • 面试官: 有了解过线程组和线程优先级吗
  • 面试官: 说一下线程的生命周期进程
  • 面试官: 说一下线程间的通信
  • 面试官: 说一下Java的共享内存模型
  • 面试官: 有了解过指令重排吗,什么是happens-before
  • 面试官: 有了解过volatile关键字吗 说说看
  • 面试官: 有了解过Synchronized吗 说说看
  • Java多线程专题之Lock锁的运用
  • 面试官: 有了解过ReentrantLock的底层完成吗?说说看
  • 面试官: 有了解过CAS和原子操作吗?说说看
  • Java多线程专题之线程池的根本运用
  • 面试官: 有了解过线程池的作业原理吗?说说看
  • 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
  • 面试官: 堵塞行列有了解过吗?说说看
  • 面试官: 堵塞行列的底层完成有了解过吗? 说说看
  • 面试官: 同步容器和并发容器有用过吗? 说说看
  • 面试官: CopyOnWrite容器有了解过吗? 说说看
  • 面试官: Semaphore在项目中有运用过吗?说说看(源码分析)
  • 面试官: Exchanger在项目中有运用过吗?说说看(源码分析)
  • 面试官: CountDownLatch有了解过吗?说说看(源码分析)
  • 面试官: CyclicBarrier有了解过吗?说说看(源码分析)
  • 面试官: Phaser有了解过吗?说说看
  • 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
  • 面试官: Stream并行流有了解过吗?说说看

引荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

  • springboot-all

  • 地址: github.com/qiuChenglei…

  • SpringBoot系列教程合集

  • 一起来学SpringCloud合集

  • SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 完成授权码形式的服务认证(一)

  • SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 完成授权码形式的服务认证(二)

博客(阅读体会较佳)

  • 我的博客(阅读体会较佳)