RxJava 认识
RxJava是响应式编程库,用于处理异步数据流。它采用事件驱动和链式调用的思想,特别适合处理网络请求、流式数据处理、数据库操作以及UI事件流。RxJava可以让异步代码像写同步代码一样流畅,并且能够优雅地管理线程。
RxJava主要由四个部分组成:Observable(事件源,生产数据)、Observer(观察者,消费数据)、Operators(变换数据)和Schedulers(线程控制)。
Observable和Observer遵循观察者模式,Observable负责发射数据,Observer负责接收数据。在RxJava中,不同的数据流处理方式对应不同的Observable类型,如处理多个数据的Standard Observable、处理大量数据并支持背压的Flowable、只发射一个数据的Single以及只关心操作是否完成的Completable。
Schedulers是RxJava提供的线程调度机制,可以轻松地在不同线程切换任务。常见的调度器有Schedulers.io()用于I/O操作,Schedulers.computation()用于计算任务,Schedulers.newThread()用于每次创建新线程,以及AndroidSchedulers.mainThread()用于Android主线程操作。
Operators是RxJava的最大特点,可以像操作数组一样操作数据流。常见的数据转换操作符有map()用于转换数据,flatMap()用于拆分和合并数据,filter()用于过滤数据,concat()和merge()用于处理多个Observable的串行和并行合并。
实战案例中,可以通过RxJava处理多个API请求,如先请求用户信息,再用用户ID请求订单。同时,可以通过onErrorResumeNext()在发生错误时提供备用方案。此外,将RxJava与Retrofit结合使用可以让网络请求完美支持响应式编程,使得异步处理更加优雅。
chatglm-sdk源码分析
摘要:
该文章主要介绍了ChatGLM SDK的源码解析和个人解析过程,通过SSE、EventSource等基础知识引入,详细阐述了项目的核心类与职责、设计模式和关键实现,如工厂模式、策略模式、建造者模式、适配器模式、观察者模式等。同时,也提到了使用RxJava作为回调类型的使用情况。
核心类与职责:
1. Configuration:负责存储API配置信息,如API_HOST、okHttpClient、openAiApi等。
2. IOpenAiApi:通过Retrofit定义API请求,主要用于非流式请求,如图片生成。
3. GLMExecutor:具体执行请求的核心类,使用OkHttp发送请求,支持流式与同步调用。
4. DefaultOpenAiSession:负责管理Executor,提供对外API入口。
设计模式:
1. 工厂模式(Factory Pattern):用于创建对象,隐藏创建逻辑,如DefaultOpenAiSessionFactory负责会话对象的创建。
2. 策略模式(Strategy Pattern):根据不同的模型类型选择不同的执行策略,如GLMOldExecutor和GLMExecutor。
3. 建造者模式(Builder Pattern):用于构造复杂对象,如ChatCompletionRequest.Prompt的构造。
4. 适配器模式(Adapter Pattern):适配新旧版接口的参数变化。
5. 观察者模式(Observer Pattern):建立一对多的依赖关系,处理异步事件,如通过EventSourceListener处理模型调用的返回事件。
RxJava的使用:
RxJava在这里作为回调类型,主要是用来处理异步操作,它能将观察者模式与函数式编程结合起来,使得异步代码更容易理解和编写。在IOpenAiApi的实现中,使用RxJava来处理API请求,可以更方便地处理异步响应和错误处理。
总结:
该文章详细解析了ChatGLM SDK的源码和设计模式,帮助读者理解其架构设计和核心实现。同时,也介绍了RxJava在回调类型中的应用。对于开发者来说,理解这些设计模式和实现方式,有助于更好地使用SDK并扩展其功能。
Retrofit 是干啥的?
Retrofit是一个网络请求库,用于简化API调用。它允许开发者像调用普通方法一样轻松发起HTTP请求并获取服务器返回的数据。通过Retrofit,开发者只需编写接口,而无需处理底层的HTTP细节。Retrofit基于OkHttp,对OkHttp进行了封装,以提供自动解析JSON和简化线程管理的功能。与传统的网络请求方式相比,Retrofit的代码更简洁,减少了手动解析JSON和创建请求的复杂性。它通过动态代理生成网络请求代码,并在底层使用OkHttp执行请求。Retrofit的主要优势在于代码简洁、自动解析JSON、支持同步和异步请求以及线程管理。总的来说,Retrofit是一个网络请求自动化工具,让网络调用像本地方法一样简单。
SSE、EventSource理解与实践
摘要:
本文介绍了EventSource,它是一种基于服务器发送事件(SSE)的工具或接口,用于从服务器向客户端推送实时更新数据。SSE是一种HTTP长连接机制,允许服务器通过持续的连接推送数据给客户端。EventSource主要包括EventSource接口、EventSourceListener接口和EventSources工具类。通过创建OkHttpClient、构建请求并使用EventSources创建事件源,可以实现SSE通信。EventSource具有自动重连机制,适用于实时数据更新、通知推送等场景。与WebSocket相比,EventSource更轻量化,适用于单向通信和实时数据流推送。然而,它也有局限性,如单向通信、不支持二进制数据传输和需要处理跨域问题等。
设计模式
未读
快速回顾常见十种设计模式应用场景
摘要:
本文主要介绍了工厂模式、单例模式、观察者模式、策略模式、模板方法模式、代理模式、装饰器模式、建造者模式、迭代器模式和责任链模式等常见的软件设计模式的应用场景和使用方法。这些模式在软件设计中广泛应用于解决不同的问题,如确保单一实例、通知对象状态变化、根据条件选择算法、继承多个类并实现部分方法、控制客户端与实际对象交互、运行时扩展对象功能、构建复杂对象、遍历集合元素以及处理请求等。通过对这些模式的应用,可以有效提高软件的灵活性和可维护性。
设计模式
未读
软件设计模式——七大设计原则
摘要:
设计模式是解决软件设计中反复出现的问题及其解决方案的一套经验总结。其目的是提高代码的可重用性、可读性和可靠性。包含多种开发原则,其中开闭原则强调对扩展开放、对修改关闭;依赖倒置原则主张面向接口编程;单一职责原则要求一个类只有一个引起变化的原因;接口隔离原则强调接口精简、功能解耦;迪米特法则减少类间耦合;里氏替换原则保护继承体系的稳定性;合成复用原则提倡使用组合或聚合实现代码复用,减少继承。这些原则的核心目的是降低对象间的耦合,增加程序的可复用性、可扩展性和可维护性。在程序设计中,应遵循功能最小化、合理使用继承、运用接口、低耦合高内聚等原则。
设计模式
未读
常见的设计模式--下
好的,以下是您所请求的摘要总结:
一、观察者模式
观察者模式定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己。在TypeScript中,可以使用接口和类来实现观察者模式。应用场景包括当被观察对象的状态发生改变时,需要更新相关依赖对象的状态。
二、发布订阅模式
发布订阅模式是一种消息范式,消息的发送者(发布者)不会直接将消息发送给特定的接收者(订阅者)。而是将发布的消息分为不同的类别,然后分别发送给不同的订阅者。订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息。在TypeScript中,可以通过类来实现发布订阅模式。应用场景包括事件总线,实现不同组件或模块间的通信。
三、策略模式
策略模式定义了一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,使程序结构更灵活、可维护、可扩展。应用场景包括一个系统需要动态地在几种算法中选择一种时,可以将每个算法封装到策略类中。
四、职责链模式
职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。请求在一个链上传递,直到链上的某一个对象处理此请求。应用场景包括在处理请求的对象集合需要被动态指定的情况下,或者在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
五、模板方法模式
模板方法模式由抽象父类和具体的实现子类组成。抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,可以选择重写父类的方法。应用场景包括算法的整体步骤很固定,但其中个别部分易变时,可以将容易变的部分抽象出来,供子类实现。
这些设计模式在软件工程中都非常常用,理解并熟练使用这些模式可以帮助我们更好地设计和开发软件。
设计模式
未读
常见的设计模式--上
总结:
一、建造者模式:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。常用于需要构建多个部分组成的复杂对象,如汽车。
二、工厂模式:
1. 简单工厂模式:根据给定的参数创建对象,而无需知道具体的产品类。
2. 工厂方法模式:工厂父类定义创建产品的接口,工厂子类负责生成具体的产品对象。适用于一个类不知道它需要哪些对象的情况。
3. 抽象工厂模式:提供创建一系列相关或依赖对象的接口,但不必指定具体的类。适用于一个系统有多个产品族的情况。
三、单例模式:确保一个类只有一个实例,并提供一个全局访问点。常用于需要频繁实例化但又只需要一个实例的对象,如全局缓存。
四、适配器模式:解决两个软件实体间的接口不兼容问题。适用于使用第三方组件但其接口不符合系统要求的情况。
以上四种设计模式在实际生活和软件开发中都有广泛的应用,选择合适的模式可以大大提高代码的可维护性和重用性。