观察者模式

设计模式:观察者模式(二)——C#内置接口实现观察者模式

限于喜欢 提交于 2019-11-27 18:59:39
通过C#的内置观察者接口实现观察者模式 1. 接口介绍 C#内部提供了IObservable 和IObserver 两个泛型接口,IObservable是可观察的,就是主题(Subject)要实现的接口,IObserver就是观察者需要实现的接口,接口定义如下: //T:提供通知信息的对象。 public interface IObservable<out T> { //通知提供程序观察程序将接收通知。 IDisposable Subscribe(IObserver<T> observer); } //T:提供通知信息的对象。 public interface IObserver<in T> { //通知观察者提供程序已完成发送基于推送的通知。 void OnCompleted(); //通知观察者提供程序遇到错误情况。 void OnError(Exception error); //向观察者提供新数据。 void OnNext(T value); } 2. Demo背景 这里与 上一篇 一致:设计一个气象观测站,测量温度、湿度、气压等,会有多种公告板如气温布告板,舒适度布告板,天气预报布告板等等。每当天气数据变化时,这些布告板的数据就需要相应自动更新。 3. 代码设计 首先建一个WeatherData,这是主题向观察者传递的数据。 public struct

观察者模式

北慕城南 提交于 2019-11-27 17:30:04
       定义   观察者模式: 定义了一种对象间的一对多依赖关系,一旦被依赖对象改变状态,所有观察者都会得到通知并自动更新 。    实例   我们在日常生活中,微信公众号的运作模式便是典型的观察者模式的实现,一旦公众号新推了内容,所有关注公众号的账号都会得到通知。    优缺点   观察者模式的优点是可以实现表示层与数据逻辑层的分离,可以在观察者与被观察者之间建立一个抽象的耦合,支持广播通信。   缺点是如果一个观察者的被观察者太多的话,通知动作会花费大量的时间。而且如果观察者与被观察者之间存在循环依赖的话,观察目标可能会触发它们的循环调用,造成系统崩溃。    类图   被观察者维护着一个观察者的集合,在有事件时循环通知集合中的观察者。   被观察者抽象规定了被观察者的行为,必须包括:新增观察者、删除观察者、通知观察者。   观察者抽象规定了观察者的行为,必须包括:接收通知。   示例   观察者抽象: /** * @Author Nyr * @Date 2019/11/26 19:21 * @Description 观察者抽象 */ public interface Obsever { /** * @Author Nxy * @Date 2019/11/26 19:21 * @Param msg:通知消息 * @Return * @Exception *

设计模式:观察者模式(一)

折月煮酒 提交于 2019-11-27 16:46:18
观察者模式 定义了对象之间一个主题对多应多个观察者的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 角色 : 主题(Subject) :主题是一个接口,该接口规定了具体主题需要实现的方法 观察者(Observer) :观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。 具体主题(ConcreteSubject) :具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体的观察者。 具体观察者(Concrete Observer) :具体观察者是实现观察者接口的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己添加到具体主题的集合中,使自己成为它的观察者,或让这个具体的主题将自己从具体的主题中的观察者列表中删除,使自己不再是它的观察者。 一对多关系 : 利用观察者模式,主题是具有状态的对象,并可以控制这些状态。也就是说,有“一个”具有状态的主题。另一方面,观察者使用这些状态,虽然这些状态并不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变了。这就产生一个关系:“一个”主题对应“多个”观察者的关系。 Demo背景   设计一个气象观测站,测量温度、湿度、气压等,会有多种公告板如气温布告板

设计模式之GOF23观察者模式

女生的网名这么多〃 提交于 2019-11-27 13:54:39
观察者模式Observer 广播机制 场景: 多个观察者--被通知改变 CS的时候,人物移动坐标变化,更新每个人地图上的坐标 核心: 当目标对象(Subject)的状态值改变时,需要及时告知所有观察者(Observer),使他们做出响应 开发中常见的场景: -聊天室程序中,服务器转发给所有客户端 -网络游戏(多人联机)中,服务器将各个玩家的状态分发 -邮件订阅 -Servlet中,监听机制 -Android中的广播机制 -JDK的AWT中事件处理模型,基于观察者模式的委派事件模型(Delegation Event Model)(事件源------目标对象,事件监听器------观察者) -京东商城中,群发商品打折信息 public class Subject { //被观察者队伍 protected List<Observer> observers=new ArrayList<>(); public void addObserver(Observer obs) { observers.add(obs); } public void removeObserver(Observer obs) { observers.remove(obs); } //通知所有被观察者的状态更新 public void notifyAllObserve() { for(Observer obs

观察者(Observer)模式

荒凉一梦 提交于 2019-11-27 11:08:48
  观察者模式又叫做发布-订阅模式(Publish.Subscribe)模式、模型-视图模式(Model/View)模式、源-监听器模式(Source/Listener)模式或从属者(Dependents)模式。   观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 1. 观察者模式结构 一个简单的观察者模型如下: 角色: 抽象(Subject)主题角色:把所有的观察者维持在一个集合中,每个主题都可以有任意数量的观察者。提供一个接口,可以增加和删除观察者,主题角色又叫做被观察者(Observable)。 抽象观察者(Observer)角色:在得到主题的通知时更新自己。有时候观察者依赖于被观察者,可以将update方法修改为 void update(Subject subject)。 具体主题角色:维护所有的观察者,在具体主题的内部状态改变时给所有登记的观察者发送通知。 具体观察者角色:存储与主题的状态自恰的状态,也就是随着主题的状态改变自己的状态。 代码如下: package cn.qlq.observer; public interface Subject { void attach(Observer observer); void delete(Observer

行为型模式(四) 观察者模式(Observer)

匆匆过客 提交于 2019-11-27 10:19:44
动机(Motivate) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 意图(Intent) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF 结构图 模式的组成 可以看出,在观察者模式的结构图有以下角色: (1)、抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类或接口实现。 (2)、抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。 (3)、具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。 (4)、具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。 观察者模式的代码实现 观察者模式在显示生活中也有类似的例子,比如:我们订阅银行短信业务,当我们账户发生改变

观察者模式,单例模式和工厂模式

谁都会走 提交于 2019-11-27 07:56:09
持续更新中... 观察者模式: ( https://blog.csdn.net/colinandroid/article/details/81113013 ) 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。 Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。 (1)保存注册的观察者对象 (2)注册观察者对象 (3)注销观察者对象 (4)通知所有注册的观察者对象 Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。 ConcreteObserver:具体的观察者。 单例模式: ( https://blog.csdn.net/q_all_is_well/article/details/82377917 ) 实现特点: (1)私有化该类的构造函数 (2)通过new在本类中创建一个本类对象 (3)定义一个公有的方法,将在该类中所创建的对象返回 实现方法: (1)单例模式的饿汉式 (2)单例模式懒汉式双重校验锁 (3)内部类 工厂模式: ( https://blog.csdn.net/u012156116/article/details/80857255 ) 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类

项目中的设计模式【观察者模式】

◇◆丶佛笑我妖孽 提交于 2019-11-27 01:31:36
项目应用场景:dmu会从设备收到告警,不可能全部都传给客户端,因为网络压力太大。采取的策略是:客户端订阅,dmu才发送。为了进一步减少网络开销,订阅的策略是订阅的范围尽可能小,订阅的时间尽可能短。查看一个设备,只订阅一个设备,进入页面订阅,离开页面取消订阅。 转载于:https://www.cnblogs.com/nzbbody/p/4604615.html 来源: https://blog.csdn.net/weixin_30654419/article/details/99234267

观察者模式

梦想与她 提交于 2019-11-27 01:27:05
解决的问题: 界面上有一些计时器控件(每个控件都有自己的Number),每个计时器每秒钟减1,当为0的时候消失; 解决方法: 1、建立接口ICount,有个Count方法; 2、计时器控件实现接口ICount; 3、建立CountManager类,统一管理这些计时器控件,使用Attach,Detach方法增加删除计时器控件; 4、CountManager初始化一个计时器,每秒执行一次,遍历计时器控件,每个减1。 注意事项: 在foreach的语句中,不能对集合增删元素,也不能使元素指向其他对象,可以修改元素的内容。在这里遍历计时器控件的时候,考虑到其他线程会对集合增删元素,或者使元素指向其他对象,foreach的时候出现异常,因此foreach之前,新建一个集合副本,对副本执行foreach。 转载于:https://www.cnblogs.com/nzbbody/p/3307529.html 来源: https://blog.csdn.net/weixin_30540691/article/details/99234413

java设计模式--观察者模式

こ雲淡風輕ζ 提交于 2019-11-27 00:54:07
观察者模式    观察者模式是对象行为型模式,它定义了一种一堆多的依赖关系,当一个对象的状态发生改变时,所有依赖于它对象都会得到通知。观察者模式也被成为发布-订阅模式。我们在使用微信的时候订阅公众号,在公众号有心得文章时会推送给订阅公众号的人,在使用微博时,关注了某博主,在我们刷微博同时博主有新的微博时会将新的消息展示给我,这两种案例都是使用了观察者模式。 观察者模式的适用性 观察者模式适用于当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。 观察者模式适用于当改变一个对象时需要立刻改变其他的对象,但是在发生改变时不知道有多少个其他对象需要改变。 观察者模式适用于当必须通知其他对象但是其他对象只有在需要通知时才知道有哪些的情况下。 观察者模式的结构图 观察者模式总共有四类角色: 1、抽象主题角色(Subject):抽象主题角色保存了它的所有观察者,同时提供了增加、删除观察者,通知观察者观察对象已改变的方法。 2、具体主题角色(ConcreteSubject):具体主题角色提供了修改合查询状态的方法,同时在修改状态时通知观察者。 3、抽象观察者角色(Observer):为在目标改变时需获得通知的对象定义一个更新的接口。 4、具体观察者(ConcreteObserver):维护一个指向ConcreteSubject的引用