行为模式-观察者模式

Posted hhd-shuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为模式-观察者模式相关的知识,希望对你有一定的参考价值。

视频审核中

观察者模式是23种设计模式种较常用的设计模式之一。数据源发生变化时(比如状态转变),如果一个对象(通常我们称之为主题subject)需要自动地通知其他多个对象(称为观察者observer),就可以采用这种设计模式。

观察者模式类图

技术图片

 

 

 使用场景案例

比如某新闻平台,当新闻数据更新时,就会推送给它的订阅用户,取消订阅则收不到消息。

代码实现

主题Subject接口

public interface Subject {
    // 注册观察者方法
    void registerObserver(Observer observer);
    // 移除观察者,取消注册
    void removeObserve(Observer observer);
    // 数据源向所有注册了的观察者发送通知
    void notifyObservers(String news);
}

抽象观察者

// 观察者接口
public interface Observer {
    // 获得通知
    void getNotification(String news);
}

具体主题,也就是我们的新闻平台

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

public class NewsPlatform implements Subject {

    // 订阅者集合
    private List<Observer> observers = new ArrayList<>();
    // 注册
    @Override
    public void registerObserver(Observer observer) {
        this.observers.add(observer);
    }
    // 取消注册
    @Override
    public void removeObserve(Observer observer) {
        observers.remove(observer);
    }

    // 发送通知
    @Override
    public void notifyObservers(String news) {
        observers.forEach(observer -> observer.getNotification(news));
    }
}

具体观察者,也就是订阅用户,包含三种订阅不同专栏用户

// financial财经类读者
class FinancialUser implements Observer{
    private String username;

    public FinancialUser(String username){
        this.username = username;
    }
    @Override
    public void getNotification(String news) {
        if(news != null && news.contains("financial")){
            System.out.println("财经类用户:" + username);
            System.out.println(" 接收推送: " + news);
            System.out.println();
        }
    }
}
// military军事类读者
class MilitaryUser implements Observer{
    private String username;

    public MilitaryUser(String username){
        this.username = username;
    }
    @Override
    public void getNotification(String news) {
        if(news != null && news.contains("military")){
            System.out.println("军事类用户:" + username);
            System.out.println(" 接收推送: " + news);
            System.out.println();
        }
    }
}
// Technology科技类读者
class TechnologyUser implements Observer{
    private String username;

    public TechnologyUser(String username){
        this.username = username;
    }
    @Override
    public void getNotification(String news) {
        if(news != null && news.contains("technologyUser")){
            System.out.println("科技类用户:" + username);
            System.out.println(" 接收推送: " + news);
            System.out.println();
        }
    }
}

测试

public class Client {
    public static void main(String[] args) {
        NewsPlatform newsPlatform = new NewsPlatform();

        FinancialUser zhangsan = new FinancialUser("张三");
        newsPlatform.registerObserver(zhangsan);
        newsPlatform.registerObserver(new MilitaryUser("李四"));
        newsPlatform.registerObserver(new TechnologyUser("王五"));

        newsPlatform.notifyObservers("military 中国055大驱下水");
        newsPlatform.notifyObservers("technologyUser iphone12发布");
        newsPlatform.notifyObservers("financial 美股熔断");

        newsPlatform.removeObserve(zhangsan);
        newsPlatform.notifyObservers("financial 美股第三次熔断");
    }
}

结果

技术图片

 

 

参考链接

https://www.jianshu.com/p/47c7ab5ad2e4

以上是关于行为模式-观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

行为模式-观察者模式

观察者模式

Python 设计模式 — 行为型模式 — 观察者模式

Python 设计模式 — 行为型模式 — 观察者模式

行为型模式之对象间的联动(观察者模式)

JAVA SCRIPT设计模式--行为型--设计模式之Observer观察者模式(19)