博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式--6观察者模式
阅读量:5016 次
发布时间:2019-06-12

本文共 2896 字,大约阅读时间需要 9 分钟。

1.观察者模式(Observer Pattern)

也叫发布订阅模式,定义对象间一种,一对多的依赖关系,使得当,一个对象状态改变时,所有依赖它的对象都能得到通知,并被自动更新

2.类图如图

(1)Subject 被观查者
定义被观察者必须实现的职责。它必须能够,管理观察者(动态添加或删除观察者),通知观察者。
(2)ConcreteSubject 具体的被观察者

(3)Observer 观察者

接收到消息后,进行update(消息处理)操作

(4)ConcreteObserver 具体观察者

3.关键,一个被观察者最好不要同时是观察者,否则这个关系很难维护
(1)优点:
观察者和被观察者之间是抽象耦合,方便扩展
建立一套触发机制,触发链

(2)观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发

和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响
整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。
被观察者发生动作了, 观察者要做出回应, 如果观察者比较多, 而且处理时间比较长怎么办? 那就用异步呗(具体怎么异步)

 

代码:

Observable

package com.design.观察者模式;/** *  * @author yafei.lv * 被观察者,要作的通知 */public interface Observable {        void addObserver(Observer observer); //添加观察者        void deleteObserver(Observer observer); //减少观察者        void notifyObservers(String context);}

ObservableMotion

package com.design.观察者模式;/** *  * @author yafei.lv * 被观察者,要做的动作 */public interface ObservableMotion {        void haveBreakFast(); // 吃饭        void haveFun(); // 娱乐}

ObservableImpl

package com.design.观察者模式;import java.util.ArrayList;import java.util.List;/** *  * @author yafei.lv * 被观察者实现 */public class ObservableImpl implements Observable,ObservableMotion {        public List
observers = new ArrayList
(); // 观察者列表 @Override public void haveBreakFast() { notifyObservers("开始吃饭...."); } @Override public void haveFun() { notifyObservers("开始娱乐...."); } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void deleteObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers(String context) { for(Observer observer : observers){ observer.update(context); } }}

Observer

package com.design.观察者模式;/** *  * @author yafei.lv * 观察者 */public interface Observer {    void update(String context);}

ObserverLiSi

package com.design.观察者模式;public class ObserverLiSi implements Observer{    @Override    public void update(String context) {         System.out.println("观察者李斯,报告,被监控者有了活动:" + context);    }}

ObserverZhaogao

package com.design.观察者模式;public class ObserverZhaogao implements Observer{    @Override    public void update(String context) {         System.out.println("观察者赵高,报告,被监控者有了活动:" + context);         System.out.println("所以我也开始吃饭,赵高");    }}

场景类:

package com.design.观察者模式;/** *  * @author yafei.lv * 场景类 */public class Main {    public static void main(String[] args) {        Observer observerLisi = new ObserverLiSi();        Observer observerZhaogao = new ObserverZhaogao();                ObservableImpl observable = new ObservableImpl();        observable.observers.add(observerZhaogao);        observable.observers.add(observerLisi);                observable.haveBreakFast();        observable.haveFun();    }}

 

转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5956548.html

你可能感兴趣的文章
HTML CSS 层叠样式表 三
查看>>
Qt pro pri 文件学习1
查看>>
【iOS】UICollectionView自己定义Layout之蜂窝布局
查看>>
发布aar到jcenter
查看>>
跨浏览器问题的五种解决方案
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>
.Net Core AES加密解密
查看>>
Mac升级bash到最新版本
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>
设计模式的征途—5.原型(Prototype)模式
查看>>
simple java mail
查看>>
信息建模
查看>>
虚函数、纯虚函数详解
查看>>
MySQL - 常用命令及常用查询SQL
查看>>
C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换
查看>>
android获取USB设备的名称
查看>>
JavaPersistenceWithHibernate第二版笔记-第七章-005排序的集合(@org.hibernate.annotations.SortComparator)...
查看>>
ue4同c#通信时的中文乱码问题
查看>>