设计模式——观察者模式
来源:互联网 发布:热血江湖人工智能披风 编辑:程序博客网 时间:2024/06/05 02:43
个人理解:
1. 观察者模式属于行为模式
2. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
3. 观察者模式UML图:
4. 成员说明
Observer:抽象观察者(抽象订阅者),为具体观察者定义update方法,在Subject通知后更新自己,可为接口或抽象类
ConcreteObserver:具体观察者(具体订阅者),对抽象观察者定义的update方法进行具体实现
Subject:抽象被观察者(抽象通知者,抽象主题),定义了增加、删除Observer及通知Observer的方法,可为接口或者抽象类
ConcreteSubject:具体被观察者(具体通知者,具体主题),具有观察者Observer列表或者集合以存储本主题的观察者(订阅者),实现了抽象Subject的增加、删除及通知方法
5. 示例代码:
Observer:
public interface Observer { void update(String string);}
ConcreteObserver:
public class NewsReader implements Observer { private String name; public NewsReader(String name) { this.name = name; } @Override public void update(String string) { Log.i("NewsReader", "------" + name + "获取到信息:" + string + "------"); }}Subject:
public interface Subject { void attach(Observer observer); void detach(Observer observer); void notify(String message);}
ConcreteSubject
public class NewsPublisher implements Subject { List<Observer> observerList = new ArrayList<>(); @Override public void attach(Observer observer) { if (!observerList.contains(observer)){ observerList.add(observer); } } @Override public void detach(Observer observer) { if (observerList.contains(observer)){ observerList.remove(observer); } } @Override public void notify(String message) { for (Observer observer : observerList){ observer.update(message); } }}
客户端调用:
private void factoryObserver(){ Subject newsPublisher = new NewsPublisher(); Observer reader1 = new NewsReader("德玛西亚"); Observer reader2 = new NewsReader("艾希"); Observer reader3 = new NewsReader("拉克丝"); Observer reader4 = new NewsReader("赵信"); Observer reader5 = new NewsReader("李青"); newsPublisher.attach(reader1); newsPublisher.attach(reader2); newsPublisher.attach(reader3); newsPublisher.attach(reader4); newsPublisher.attach(reader5); newsPublisher.notify("LOL今晚5黑开始");}
运行结果:
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------德玛西亚获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------艾希获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------拉克丝获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------赵信获取到信息:LOL今晚5黑开始------
12-21 15:42:13.431 10520-10520/com.wdp.designtest I/NewsReader: ------李青获取到信息:LOL今晚5黑开始------
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者模式
- 设计模式—观察者
- 设计模式——观察者设计模式
- 设计模式——观察者
- 设计模式——观察者
- 设计模式 —— 观察者
- 设计模式——观察者
- 【设计模式】——观察者
- 设计模式——观察者模式
- 每日设计模式——观察者模式
- 关于微信公众号获取token的学习总结
- 北京云栖大会MaxCompute又出大招,Python UDF抢先体验!
- MySQL添加新用户、为用户创建数据库、为新用户分配权限
- 深度学习—加快梯度下降收敛速度(一):mini-batch、Stochastic gradient descent
- 判断使用的代理IP是否有用
- 设计模式——观察者模式
- windows数据库mysql安装及C++连接
- 演讲实录 | Service Mesh 时代的选边与站队(附PPT下载)
- CentOS服务器上搭建Gitlab安装步骤、中文汉化详细步骤、日常管理以及异常故障排查
- ios字体大小适配(Category)
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- MySQL is running but PID file could not be found(解决方法)
- java设计模式都有哪些?
- 【转载】如何搭建一个快速的分布式计算平台?Parallel python提供了简易的方式来实现此目的。