ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 1,面向对象 ***** | 痛点        | 开源解决方案    | 实现流程     | 参考地址   | 基础知识   |  | :-------- | :------- | :------- | :---- |:---- | | 性能开销大    | Guava缓存   | LoadingCache | Guava LoadingCache | Java、集合|        |         | Reactor     | Flux/Mono | Reactor 教程| Java、Lambda| | 可移植性差   | Thrift      | IDL定义->编译 | Thrift 教程  | 数据序列化| |         | Protobuf   | .proto定义->编译  | Protobuf 语法| 数据序列化| | 调试困难    | GDB     | 断点设置     | GDB调试教程 | C/C++|  |         | Valgrind | Memcheck检测   | Valgrind 教程| C/C++|        | 设计难度大   | 23种设计模式| 工厂模式等    | 设计模式之禅 | 面向对象理论|    |版本升级难|Spring MVC + Vue| REST API | Spring MVC 教程 | Spring、Vue| |         |Swagger   | Swagger Doc   | Swagger 教程 | OpenAPI规范| |分布式不友好  |Dubbo         | XML/Java配置   | Dubbo用户手册| Java、网络编程|        |         |Spring Cloud | 服务注册/调用  | Spring Cloud教程| Spring、网络编程 |  |理论不完备   |C# 多重继承   | : base class1,class2| C# 多重继承| C#、面向对象| |         | Rust Trait  | trait定义     | Rust Trait教程| Rust语言| ### 1.1, 23 种设计模式 #### 1.1.1, 创建型模式: - ##### 1.工厂方法模式: 定义一个用于创建对象的接口,让子类决定要实例化的类。工厂方法让类的实例化推迟到子类。 - ##### 2.抽象工厂模式: 提供一个接口用于创建相关或相互依赖的对象组,而无需指定它们具体的类。 - ##### 3.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - ##### 4.原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 - ##### 5.单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 |模式|应用场景|通俗解释|模式代码实现参考地址|  |:--:|:--:|:--:|:--:| |工厂方法模式|定义一个用于创建对象的接口,让子类决定要实例化的类|汽车工厂生产不同品牌的汽车|[https://www.runoob.com/design-pattern/factory-method-pattern.html](https://www.runoob.com/design-pattern/factory-method-pattern.html)| |抽象工厂模式|提供一个接口用于创建相关或相互依赖的对象组,而无需指定它们具体的类|生产兼容的硬件设备|[https://www.runoob.com/design-pattern/abstract-factory-pattern.html](https://www.runoob.com/design-pattern/abstract-factory-pattern.html)|  |建造者模式|将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示|房地产项目|[https://www.runoob.com/design-pattern/builder-pattern.html](https://www.runoob.com/design-pattern/builder-pattern.html) |原型模式|用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象|通过一个中心商店制造产品的副本|[https://www.runoob.com/design-pattern/prototype-pattern.html](https://www.runoob.com/design-pattern/prototype-pattern.html)| |单例模式|保证一个类仅有一个实例,并提供一个访问它的全局访问点|Windows的任务管理器|[https://www.runoob.com/design-pattern/singleton-pattern.html](https://www.runoob.com/design-pattern/singleton-pattern.html)| #### 1.1.2, 结构型模式: - ##### 6.适配器模式: 将一个类的接口转换成客户希望的另外一个接口。适配器让原本由于接口不兼容而不能一起工作的那些类可以一起工作。 - ##### 7.桥接模式: 将抽象与实现分离,使得两者可以独立变化。 - ##### 8.装饰器模式: 动态地将责任附加到对象上。若要扩展功能,装饰器提供了比继承更为灵活的替代方案。 - ##### 9.组合模式: 将对象组合成树形结构以表示“部分-整体“的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。 - ##### 10.外观模式: 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - ##### 11.享元模式: 使用共享对象可有效地支持大量细粒度的对象。 - ##### 12.代理模式: 为其他对象提供一种代理以控制对这个对象的访问。代理模式可以将代理对象与真实的服务对象进行分离,这样在真实对象发生变化时,代理对象可以起到保护作用,并无需立即变化。 |模式|应用场景|通俗解释|模式代码实现参考地址| |:--:|:--:|:--:|:--:| |适配器模式|将一个类的接口转换成客户希望的另外一个接口|插头转接头|[https://www.runoob.com/design-pattern/adapter-pattern.html](https://www.runoob.com/design-pattern/adapter-pattern.html)| |桥接模式|将抽象与实现分离,使得两者可以独立变化|遥控器和电视机|[https://www.runoob.com/design-pattern/bridge-pattern.html](https://www.runoob.com/design-pattern/bridge-pattern.html)| |装饰器模式|动态地将责任附加到对象上|咖啡调料|[https://www.runoob.com/design-pattern/decorator-pattern.html](https://www.runoob.com/design-pattern/decorator-pattern.html)| |组合模式|将对象组合成树形结构以表示“部分-整体“的层次结构|公司组织结构|[https://www.runoob.com/design-pattern/composite-pattern.html](https://www.runoob.com/design-pattern/composite-pattern.html)| |外观模式|为子系统中的一组接口提供一个一致的界面|门面|[https://www.runoob.com/design-pattern/facade-pattern.html](https://www.runoob.com/design-pattern/facade-pattern.html)| |享元模式|使用共享对象可有效地支持大量细粒度的对象|字符串常量池|[https://www.runoob.com/design-pattern/flyweight-pattern.html](https://www.runoob.com/design-pattern/flyweight-pattern.html)| |代理模式|为其他对象提供一种代理以控制对这个对象的访问|保险代理人|[https://www.runoob.com/design-pattern/proxy-pattern.html](https://www.runoob.com/design-pattern/proxy-pattern.html)| #### 1.1.3, 行为型模式: - ##### 13.责任链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 - #####14.命令模式: 将一个请求封装为一个对象,从而使你可以用不同的请求参数ize方法执行请求。 - ##### 15.解释器模式: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 - ##### 16.迭代器模式: 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。 - ##### 17.中介者模式: 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散。 - ##### 18.备忘录模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - ##### 19.观察者模式: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - ##### 20.状态模式: 允许一个对象在其内部状态改变时改变其行为。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。 - ##### 21.策略模式: 定义一系列的算法,将每一个算法都封装起来,使它们之间可以互相替换。 - ##### 22.模板方法模式: 在一个方法中定义一个算法的骨架,并将其某些步骤推迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 - ##### 23.访问者模式: 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 |模式|应用场景|通俗解释|模式代码实现参考地址| |:--:|:--:|:--:|:--:| |责任链模式|多级请求处理|上级没处理就传给下级,下级没处理再传给再下级|[https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html](https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html)|  |命令模式|实现UNDO功能|类似遥控器,执行对应的命令|[https://www.runoob.com/design-pattern/command-pattern.html](https://www.runoob.com/design-pattern/command-pattern.html)| |解释器模式|编译器的解析器|编译原理中的解释器|[https://www.runoob.com/design-pattern/interpreter-pattern.html](https://www.runoob.com/design-pattern/interpreter-pattern.html)| |迭代器模式|访问容器内元素|遍历容器|[https://www.runoob.com/design-pattern/iterator-pattern.html](https://www.runoob.com/design-pattern/iterator-pattern.html)|    |中介者模式|解耦|roducer和Consumer通过中间人Mediator联系|[https://www.runoob.com/design-pattern/mediator-pattern.html%7C](https://www.runoob.com/design-pattern/mediator-pattern.html%7C) |备忘录模式|实现撤销操作|游戏存档|[https://www.runoob.com/design-pattern/memento-pattern.html](https://www.runoob.com/design-pattern/memento-pattern.html)|  |观察者模式|事件处理|推送服务,邮件列表订阅|[https://www.runoob.com/design-pattern/observer-pattern.html%7C](https://www.runoob.com/design-pattern/observer-pattern.html%7C) |状态模式|状态变化引起行为改变|人生的不同阶段,状态不同,行为也不同|[https://www.runoob.com/design-pattern/state-pattern.html](https://www.runoob.com/design-pattern/state-pattern.html)|  |策略模式|算法可变|计算器的加减乘除算法可替换|[https://www.runoob.com/design-pattern/strategy-pattern.html](https://www.runoob.com/design-pattern/strategy-pattern.html)|  |模板方法模式|算法固定的流程,某些步骤可变|做饭的流程大致相同,某些细节可变|[https://www.runoob.com/design-pattern/template-method-pattern.html](https://www.runoob.com/design-pattern/template-method-pattern.html)|    |访问者模式|对象结构中的元素的操作|出入境管理中人员行为的检查|[https://www.runoob.com/design-pattern/visitor-pattern.html](https://www.runoob.com/design-pattern/visitor-pattern.html)| 5. JDK中的设计模式: |模式|示例| |:--:|:--:| |工厂模式|java.util.Calendar#getInstance()| |单例模式|java.lang.Runtime#getRuntime()| |适配器模式|java.util.Arrays#asList()| |观察者模式| java.util.Observable| |模板方法模式|java.util.Collections#sort()| |迭代器模式|java.util.Iterator| |组合模式|java.awt.Container#add(Component)| |代理模式|java.lang.reflect.Proxy| |装饰者模式|java.io.InputStreamDecorator| |命令模式|java.lang.Runnable| 6. Spring中的设计模式: |模式|示例|  |:--:|:--:| |工厂模式|Objects.newInstance(“com.example.Example”, constructorArguments)| |单例模式|@Scope(“singleton”)| |适配器模式|HandlerAdapter|  |观察者模式|ApplicationEventPublisher | |模板方法模式|@Transactional| |迭代器模式|iterate()| |组合模式|@ControllerAdvice|  |代理模式|AOP代理| |命令模式|@Scheduled| |装饰者模式|FilteringSpringContextLoader| 7. 开发中的设计模式应用: |模式|示例| |:--:|:--:| |工厂模式|根据条件创建不同实例| |单例模式|logger,配置类 | |适配器模式|第三方接口适配|  |观察者模式|事件驱动 | |模板方法模式|项目启动模板| |迭代器模式|枚举| |组合模式|树形结构|  |代理模式|权限校验| |命令模式|任务调度| |装饰者模式|引入额外功能| ## 2,面向对象 VS 面向切面 ***** 1\. 面向切面像是在制定政策时考虑社会各阶层的需求,**`Vs`** 面向对象像是在组织企业时按职能部门进行划分。 2\. 面向切面强调解耦和重用但难以理解,像是政策制定要兼顾各方面但复杂难懂。**`Vs`** 面向对象简单易懂但增加开销,像是组织结构清晰但成本高。 3\. 面向切面实现难度高需要语言机制,**`Vs`** 面向对象理解简单只需要掌握思想和设计模式。 4\. 面向切面可能导致过程混乱,**`Vs`** 面向对象可能导致设计过于复杂。 > | 对比维度       | 面向切面         | 面向对象        | 通俗表达   | | :-------- | :------- | :------- | :---- | | 主要特性      | 切面(Aspect)隔离横切关注点| 类(Class)封装对象结构与行为| 处理交叉的需求|    |技术边界     | 容易导致程序流程混乱     | 类之间高度耦合,设计难度较大|过程混乱 vs 复杂设计| |主要优点     | 解耦合,提高模块重用性   | 封装、继承、多态方便扩展|灵活变化 vs 扩展方便|  |主要缺点     | 调试困难,学习曲线陡峭   | 性能开销较大,独立性降低|难理解 vs 開銷大| |实施难度     | 较高,需要熟悉AOP理论    | 较低,面向对象思想较为直观|高深 vs 简单易懂| |基础条件      | 语言支持AOP,Spring AOP等 | 面向对象语言,设计模式等|语言机制 vs 设计思想| |社会场景   |政策制定:关注社会各阶层|企业组织:按职能部门划分|涉及多方 vs 标注职责| ## 3, 面向切面 ***** ### 面向切面编程的主要思想: 1. 把程序逻辑分解成不同的关注点`(concern)`,比如日志、安全、事务等。每一个关注点均作为一个模块开发。 2. 定义横切关注点`(cross-cutting concern),`这些关注点影响多个模块。例如日志、安全和事务等。 3. 使用切面(aspect)模块化这些横切关注点。切面模块具有切入点`(pointcut)`、通知`(advice)`等元素。 4. 在编译阶段或类加载阶段,通过织入`(weaving)`将切面模块与其他模块结合,生成最终的程序。 ***使用场景:*** - 日志:用于记录程序运行信息,在多个模块中使用,可以抽取成切面。 - 安全:对用户权限的判断,在多个模块中使用,可以抽取成切面。 - 事务:用于处理数据库事务,在多个模块中使用,可以抽取成切面。 - 性能统计:用于统计程序运行时间和次数,在多个模块中使用,可以抽取成切面。 ***通俗社会应用场景表述:*** - 日志:编辑朋友圈或博客时,系统自动记录操作日志,这是日志切面。 - 安全:登录网站时,系统自动判断用户权限,这是安全切面。 - 事务:网上支付时,系统自动处理支付事务,这是事务切面。 - 性能统计:使用app时,系统自动统计app的启动次数和使用时长,这是性能统计切面。 #### 面向切面编程的主要优点: * 提高模块化:可以更好地抽离横切关注点,使得每个模块只关注自身的业务逻辑。 * 减低耦合度:通过横切关注点的隔离,每个模块只依赖于自己的业务,不需要依赖其他模块的实现细节。 * 提高重用性:横切关注点本身具有一定的通用性,可以重用。 * 更灵活的程序结构:通过织入,可以更动态和灵活地构建程序结构。 #### 面向切面编程的主要缺点: * 提高系统的复杂度:需要额外学习面向切面编程的概念和开发技术,而且debug也比较复杂。 * 可能产生意外的切面互相作用:不同的切面可能在同一个切入点上定义通知,这可能产生意外的相互作用,需要加以注意。 * 可能产生性能开销:织入过程可能会产生一定的性能开销,需要测试和评估