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