观察者模式

设计模式笔记-观察者模式

穿精又带淫゛_ 提交于 2020-03-09 00:26:19
设计模式 观察者模式 文章目录 设计模式 观察者模式 抽象 解释 自定义观察者模式 上述代码存在的问题 测试一下 官方的实现 完善实现 观察者模式指的是一系列对象之间存在一对多的依赖关系,一旦某个对象的状态改变,其余对象就会立刻接收到相应的通知。 抽象 一些对象当作可观察者,而另一些对象当作观察者。为了在文字上做一些区别,可以将 可观察者 称为 主题 。 解释 一对多的依赖关系不仅仅指一个 主题 可以有多个 观察者 ,还包括一个 观察者 可以订阅多个 主题 。 只有当 主题 的状态改变的时候,并且期望 推送 通知的时候才会通知 观察者 。这种 期望推送 的设计用来避免频繁的推送消息给观察者。 自定义观察者模式 假设有一个书店,顾客可以订阅该书店,如果该书店有新书到了顾客就会收到通知。 这里,书店就是一个 主题 ,顾客就是 观察者 。 为了遵循 针对接口编程,而非实现 的设计原则,需要先设计两个接口 Subject , Observer 。其中, Subject 具有注册观察者,取消注册观察者,通知观察者的行为。 Observer 具有利用主题推送的信息来更新自己的行为。 public interface Subject { void registerObserver ( Observer observer ) ; void unregisterObserver ( Observer

观察者模式

≯℡__Kan透↙ 提交于 2020-03-07 00:51:14
观察者模式完美的将观察者和被观察的对象分离开。 举个例子, 用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。 一个对象只做一件事情, 并且将他做好。 观察者模式在模块之间划定了清晰的界限 ,提高了应用程序的可维护性和重用性。实现观察者模式有很多形式, 比较直观的一种是使用一种“注册——通知——撤销注册”的形式。 当管理员登录时,会自动发送邮件和记录到数据库,这两个就是观察者,而管理员登录就是被观察者。 $_login = new Login(); //被观察者 $_login->attach(new MailWarning());//注册发送邮件的观察者 $_logger = new Logger(); $_login->attach($_logger);  //注册记录到数据库的观察者 echo $_login->handleLogin('admin', '123456');  //管理员登录 <?php //被观察者 abstract class Observable { abstract public function attach(Observer $_observer); //注册观察者 abstract public

Observer

北战南征 提交于 2020-03-05 12:13:17
定义   观察者模式是对象的行为模式。   观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 结构和角色       主题角色 : Subject是一个接口,定义了增加,移除观察者和通知观察者方法。   观察者角色 : Observer是一个接口, 为所有具体观察者定义了更新的方法,当主题角色(被观察者)状态发生改变,会调用此方法。   具体主题角色 : ConcreteSubject,实现主题角色接口,管理观察者集合;将有关状态存入具体观察者,在具体主题的内部状态改变时,给所有登记过的观察者发出通知(即调用update方法)。   具体观察者角色 : ConcreteObserver 实现Observer接口。接受主题角色的通知。 代码..... 问题    如果有多个具体主题角色(被观察者角色),那么管理观察者集合的方法和通知观察者方法是不是会重复?   从以上实现来看,主题角色是一个接口,所以每一个具体主题角色都要实现主题角色接口的方法。观察者有共同的(Observer)接口,具体主题角色里定义的是观察者 接口 的集合。 所以每一个具体主题角色在管理观察者集合的方法和通知观察者方法都是相同的。这就造成了代码的重复。 解决以上问题的方法 (也是Java内置的观察者模式)

接近金三银四?不要慌,先刷完这几百道面试题

懵懂的女人 提交于 2020-03-04 22:09:14
快到金三银四了,很多小伙伴还没有复工,在家呆的有点慌,不知道之后会面临的裁员还是被裁员。在这里我给大家收集了很多面试题,刷完这些面试题,金三银四丝毫不用慌了 AndroidBAT面试专题PDF+学习笔记+相对应的视频教程(见末尾) 一丶Android常问基础面试点 1.四大组件的生命周期和简单用法 1) Activity : onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory() onCreate() :为 Activity 设置布局,此时界面还不可见; onStart() : Activity 可见但还不能与用户交互,不能获得焦点 onRestart() : 重新启动 Activity 时被回调 onResume() : Activity 可见且可与用户进行交互 onPause() : 当前 Activity 暂停,不可与用户交互,但还可见。在新 Activity 启动前被系统调用保存现有的 Activity 中的持久数据、停止动画等。 onStop() : 当 Activity 被新的 Activity 覆盖不可见时被系统调用 onDestory() : 当 Activity 被系统销毁杀掉或是由于内存不足时调用 2) Service a) onBind 方式绑定的:

仿微博社交平台系统设计[四]--使用springevent事件驱动模型(观察者模式)结合redis bitmap 运用 实现每日数据统计

青春壹個敷衍的年華 提交于 2020-03-04 20:35:18
观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 如何解决: 使用面向对象技术,可以将这种依赖关系弱化。 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 Spring Boot 之事件(Event) Spring的事件通知机制是一项很有用的功能,使用事件机制我们可以将相互耦合的代码解耦,从而方便功能的修改与添加。本文我来学习并分析一下Spring中事件的原理。 举个例子,假设有一个添加评论的方法,在评论添加成功之后需要进行修改redis缓存、给用户添加积分等等操作。当然可以在添加评论的代码后面假设这些操作

设计模式笔记----观察者模式

北战南征 提交于 2020-03-04 18:51:24
一,问题引入 天气预报项目需求 1.气象站可以将每天测量到的温度,湿度,气压等以公告的形式发布出去 2.需要设计开放型api,便于其他第三方,也能接入气象站获取数据 3.提供温度,气压和湿度的接口 4.测量数据更新时,要能实时的传给第三方 二,普通方案 WeatherData:天气数据 package 设计模式.观察者模式.普通方案; //包含一个website对象,一旦数据有更改,就主动调用website对象的update public class WeatherData { private float temperature; private float pressure; private float humidity; private Website date; public WeatherData(Website date){ this.date=date; } public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public float getPressure() { return pressure; } public void setPressure

【iOS开发】观察者模式

前提是你 提交于 2020-03-03 19:24:28
定义了一种一对多的关系,可以让多个观察者同时监听某一个对象或对象属性的变化。 被监听的对象在状态变化时,会通知所有的观察者,使他们能够及时的处理业务逻辑和代理delegate模式的对比。 iOS提供了KVO机制实现方式 关键步骤: 1. 注册监听 [ self . webView addObserver : self forKeyPath : @"estimatedProgress" options : NSKeyValueObservingOptionNew context : nil ] ; self作为监听者,接收事件 监听self.webView的estimateProgress属性 在NSKeyValueObseringOptionNew的时候发送通知 2. 移除监听 [ self . webView removeObserver : self forKeyPath : @"estimatedProgress" ] ; 3. 接收通知 - ( void ) observeValueForKeyPath : ( NSString * ) keyPath ofObject : ( id ) object change : ( NSDictionary < NSKeyValueChangeKey , id > * ) change context : ( void * )

C#委托、事件和观察者模式

只谈情不闲聊 提交于 2020-03-03 07:06:15
委托的定义 委托是方法的载体,可以承载一个或多个方法,也可以将其看成一种特殊的数据类型,而这个数据类型存储的是方法,委托都派生于System.Delegate。委托是将方法当做变量使用,有利于解决代码冗余的问题和回调的问题。 委托的写法 如何写一个委托,首先是在类的前面书写,但是要点是需要知道当前这个委托是需要将什么方法当做变量存入到委托中去,方法有没有参数,如果有参数的话,那么书写时需要加入与方法一致的参数列表;其次要注意的是方法有没有返回值,若果有,那么这个委托也需要写入相同的返回值类型。简单实例如下: //先简单写三个不同的方法 //第一个方法 public void Write ( ) { //自定义内容,就不写了} //第二个方法 public void Write ( Student student ) //这里的括号里面的Student是一个类 { //自定义内容; } //第三个方法 public string Write ( string name ) { return name ; } //如果要将第一个方法当做变量存入委托中,那么委托如下这么些 public delegate void WriteDelegate ( ) ; //同理第二个、第三个 public delegate void WriteDelegate ( Student s ) ;

观察者(发布——订阅)模式

梦想的初衷 提交于 2020-03-02 18:13:02
观察者模式   观察者模式广泛应用于客户端JavaScript编程中。所有的浏览器事件(鼠标悬停,按键等事件)是该模式的例子。它的另一个名字也称 自定义事件 ,与那些由浏览器触发的相比,自定义事件表示是由你编程实现的事件。此外,该模式的另一个别名是 订阅——发布模式 。   设计这种模式背后的主要动机是促进形成松散耦合。在这种模式中,并不是一个对象调用另一个对象的方法,而是一个对象订阅另一个对象的特定活动并在状态改变后获得通知。订阅者也称之为观察者,而被观察者的对象称为发布者或主题。当发生了一个重要的事件时,发布者将会通知(调用)所有订阅者并且可能经常以事件对象形式传递消息。 1. 现实中的观察者模式   以售楼处为例,小明想要买房,于是招待人员记下小明的手机。小兵,小龙也买房,招待人员获得他们的手机通通给记在花名册上,过几天,有了他们中意的房子,工作人员便会翻开花名册,打电话伺候。   在这个例子中,小明,小龙,小兵是订阅者,他们订阅房子的信息。售楼处是发布者,一有消息便会依次打电话给购房者。 2. DOM事件   实际上,只要我们曾经在DOM节点上面绑定过事件函数,那我们就曾经使用过观察者模式,来看看下面这两句简单的代码发生了什么事情: document.body.addEventListener('click', function () { alert('1'); },

RunLoop相关知识点

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 14:25:31
NSRunLoop类声明的编程接口对象管理输入源。NSRunLoop对象处理鼠标和键盘等输入来源来自窗口系统的事件,NSPort对象,NSConnection对象。还一个NSRunLoop对象流程NSTimer事件 - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; + (NSRunLoop *)currentRunLoop; + (NSRunLoop *)mainRunLoop NS_AVAILABLE(10_5, 2_0); 消息处理模式,对消息处理过程进行了更好的抽象和封装 1.输入事件来源:输入源(input source)和定时源(timer source).使用程序的某一特定的处理例程来处理到达的事件。 当你创建输入源,你需要将其分配给runloop中的一个或多个模式。模式只会在特定事件影响监听的源。大多数情况下,runloop运行在默认模式下,但是你也可以使其运行在自定义模式下。若某一源在当前模式下不被监听,那么任何其生成的消息只在runloop运行在其关联的模式下才会被传递。 传递异步事件,通常消息来自于其他线程或程序。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop对象调用) 1.1 基于端口的输入源由内核自动发送