Observer

Mediator Pattern中介者模式

天大地大妈咪最大 提交于 2020-08-07 10:10:39
中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 介绍 意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。 何时使用: 多个类相互耦合,形成了网状结构 。 如何解决: 将上述网状结构分离为星型结构 。 关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。 应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。 优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。 缺点: 中介者会庞大,变得复杂难以维护。 使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为

JAVA OOP 编程-常用设计模式

帅比萌擦擦* 提交于 2020-08-07 09:24:02
smart-design-pattern 💥 👿 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看设计模式的同学!尤其适合看下本项目! 让你在极短的时间内,增加自己的编程内功,从此成为抽象派coding达人, 走向人生巅峰 ! 设计模式 单例模式 1、如何实现一个单例对象;2、如何实现一个并发安全的单例对象(Double Check Lock) 工厂模式 1、简单工厂;2、简单工厂升级版;3、抽象工厂 代理模式 1、通过Java代码实现静态代理 2、JDK动态代理的实现 3、CGLIB动态代理的实现 4、基于SpringAop拦截所有的Controller层,实现统一的接口访问日志功能; 观察者模式 继承JDK原生提供的Observable类实现被观察者,以及实现Observer观察者接口,从而实现观察者模式的联动; 策略模式 将一个接口作为对象参数进行传参,通过接口的多态性质,从而实现各种不同实现类的效果调用; 适配器模式 在不改变原有代码的情况下使其具备其它代码的特性(采用继承和组合的方式) 模板模式 也是一个很舒服的设计模式之一,可以让你更加加深对父类(抽象类)的使用和理解; 此处重点说明下模板模式的原理以及JDK双亲委派机制对模板模式的运用; 装饰器模式

一头不安分的蜗牛/classic-bluetooth

筅森魡賤 提交于 2020-08-06 10:42:21
Android传统(经典)蓝牙框架 最新版本 功能 支持多设备同时连接 支持观察者监听或回调方式。注意:观察者监听和回调只能取其一! 支持使用注解@RunOn控制回调线程 支持设置回调或观察者的方法默认执行线程 配置 因为使用了jdk8的一些特性,需要在module的build.gradle里添加如下配置: //纯java的项目 android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } //有kotlin的项目还需要在project的build.gradle里添加 allprojects { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 kotlinOptions { jvmTarget = '1.8' apiVersion = '1.3' languageVersion = '1.3' } } } module的build

对Vue中的MVVM原理解析和实现

淺唱寂寞╮ 提交于 2020-08-06 02:12:45
对Vue中的MVVM原理解析和实现 首先你对Vue需要有一定的了解,知道MVVM。这样才能更有助于你顺利的完成下面原理的阅读学习和编写 下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家可以学习到: 1.Vue数据双向绑定核心代码模块以及实现原理 2.订阅者-发布者模式是如何做到让数据驱动视图、视图驱动数据再驱动视图 3.如何对元素节点上的指令进行解析并且关联订阅者实现视图更新 1、思路整理 实现的流程图: 我们要实现一个类MVVM简单版本的Vue框架,就需要实现一下几点: 1、实现一个数据监听Observer,对数据对象的所有属性进行监听,数据发生变化可以获取到最新值通知订阅者。 2、实现一个解析器Compile解析页面节点指令,初始化视图。 3、实现一个观察者Watcher,订阅数据变化同时绑定相关更新函数。并且将自己放入观察者集合Dep中。Dep是Observer和Watcher的桥梁,数据改变通知到Dep,然后Dep通知相应的Watcher去更新视图。 2、实现 以下采用ES6的写法,比较简洁,所以大概在300多行代码实现了一个简单的MVVM框架 。 1、实现html页面 按Vue的写法在页面定义好一些数据跟指令,引入了两个JS文件。先实例化一个MVue的对象,传入我们的el,data,methods这些参数。待会再看Mvue.js文件是什么? html

观察者模式

倖福魔咒の 提交于 2020-08-05 21:42:58
观察者模式简述 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 观察者模式结构与实现 实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。 观察者模式主要结构如下: 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。 uml图如下: 观察者模式代码实现如下: /** * 抽象主题(被观察角色) */ public abstract class Subject{ // 观察者list集合(聚集对象) protected List<Observer>

spring使用了哪些设计模式

痞子三分冷 提交于 2020-08-04 10:16:24
Spring 中使用了哪些设计模式? 好了,话不多说,开始今天的内容。spring中常用的设计模式达到九种,我们举例说明。 Spring 框架中用到了哪些设计模式: 工厂设计模式 : Spring使用工厂模式通过 BeanFactory 、 ApplicationContext 创建 bean 对象。 代理设计模式 : Spring AOP 功能的实现。 单例设计模式 : Spring 中的 Bean 默认都是单例的。 模板方法模式 : Spring 中 jdbcTemplate 、 hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller 。 …… 1、简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数

设计模式在 Spring 中的应用解析(建议收藏系列)

只愿长相守 提交于 2020-07-28 18:48:03
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记只是一直没有记忆 。 今天,就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念,才能在工作学习 中运用到“无形”。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范 。 spring中常用的设计模式达到九种,我们一一举例 : 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象 ,但是否是在传入 参数后创建还是传入参数前创建这个要根据具体情况来定。 如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean 。 第二种:工厂方法(Factory Method) 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式, 即应用程序将对象的创建及初始化职责交给工厂对象。 一般情况下,应用程序有自己的工厂对象来创建bean. 如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。

JS核心理论之《Vue响应式原理及MVVM实现》

喜夏-厌秋 提交于 2020-07-28 17:42:31
MVVM 概念 MVVM 表示的是 Model-View-ViewModel 。 Model:模型层,负责处理业务逻辑以及和服务器端进行交互 View:视图层:负责将数据模型转化为UI展示出来,可以简单的理解为HTML页面 ViewModel:视图模型层,用来连接Model和View,是Model和View之间的通信桥梁 View层和Model层并没有直接联系,而是通过ViewModel层进行交互。ViewModel层通过双向数据绑定将View层和Model层连接了起来,使得View层和Model层的同步工作完全是自动的。 实现数据绑定的方式及代表有: 发布订阅模式(Backbone) 数据劫持或代理(VueJS,AvalonJS) 通过 Object.defineProperty 或 Proxy ,前者 不能监听数组变化 , 必须遍历对象的每个属性 , 嵌套对象必须深层遍历 ; 后者可以 监听数组变化 ,仍然 需要深层遍历嵌套对象 ,兼容性不如前者。 数据脏检查(AngularJs,RegularJS) 在 可能触发 UI 变更的时候 进行脏检查,如DOM事件,XHR响应事件、定时器等。 实现 双向数据绑定需要实现以下三个类: Observer 监听器:用来监听属性的变化,并通知订阅者 Watcher 订阅者:接受属性变化的通知,然后更新视图 Compile 解析器:解析指令

【译文】【前端架构鉴赏 03】:Angular 与 MVP 模式

╄→尐↘猪︶ㄣ 提交于 2020-07-28 15:48:33
感谢阅读,感谢这几个月来的陪伴,这是今年架构系列的最后一篇。 李熠:【译文】【前端架构鉴赏 01】:Angular 架构模式与最佳实践 ​ zhuanlan.zhihu.com 李熠:【译文】【前端架构鉴赏 02】:可拓展 Angular 2 架构 ​ zhuanlan.zhihu.com 原文: https:// indepth.dev/model-view- presenter-with-angular/ 随着应用程序的日趋庞大,它变得越来越难以维护。随着可复用模块的重要性逐渐递增应用的复杂性也随之增长。我们都意识到我们应该在它面临难以维护的风险之前做些什么 设计模式能够拯救它! 复杂应用 一个复杂应该至少拥有以下某些特征 组件树中的多个组件展示同一份应用状态 拥有多个更新应用状态的来源: 多个用户同时交互 后端实时推送状态更新给浏览器 后台定时任务 近距离传感器或者其它设备传感器 频繁的更新应用状态 大量的组件 代码量大的组件,回想一下之前的 大泥球 般的 AngularJS controller 组件内部的高度复杂循环——高度集中的逻辑分支和异步控制流 但与此同时,我们希望应用是具有可维护的,可测试的,可拓展的和具有良好性能的 复杂的应用很少拥有所有这些宝贵特征。我们也不能在完成高级功能需求的情况下避免这些所有的特征,但是我们可以通过设计应用来最大化利用它的宝贵特征 译者注

Laravel模型事件的实现原理详解

旧巷老猫 提交于 2020-07-28 03:59:16
模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴。 前言 Laravel的ORM模型在一些特定的情况下,会触发一系列的事件,目前支持的事件有这些:creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored,那么在底层是如何实现这个功能的呢? 下面话不多说了,来一起看看详细的介绍吧。 一.如何使用模型事件 先来看看如何使用模型事件,文档里面写了两种方法,实际上总共有三种方式可以定义一个模型事件,这里以saved事件来做例子,其他事件都一样。 1.events属性 直接上代码: class User extends Authenticatable { use Notifiable; protected $events = [ 'saved' => UserSaved::class, ]; } 这个比较难以理解,而且文档并没有详细说明,刚开始以为saved被触发后会调用UserSaved里面的handle方法,实际上并不是。这个数组只是对事件做的一个映射