当前位置: 首页 > article >正文

设计模式复习小结

1.容易忘得设计原则

接口隔离:指接口中的功能太杂则可以拆分一下。防止实现类实现了接口后自动依赖了一些不需要的功能。不同功能拆分成不同的接口。

里氏代换:强调父类能出现的地方,子类一定能正常跑。

迪米特法则:又称最少知识原则,只与直接朋友通信,提高模块独立性。

单一职责,合成复用,开闭原则

依赖倒转: 指聚合/组合时使用抽象而非具体的子实现类。对抽象编程。降低客户与实现模块之间的藕合。“父类引用指向子类对象” 这说明 依赖倒转结合使用了里氏代换原则。

2、控制反转,指我写了一套抽象的支付代码,spring帮我去管理是阿里支付还是微信支付。
这个概念建立在依赖倒转原则上。即编码基于抽象。

 依赖倒转是说我依赖的时候不依赖具体实现了,我依赖倒转了,变成了依赖抽象。控制反转强调的是谁创建对象。比如由容器进行构造器注入,setter注入等。

我先依赖倒转,依赖抽象支付工具,写抽象代码,然后控制反转注入bean交给spring。这样我的工作就大大简化。不需要自己去太多关注支付方式。

3.关于适配器模式 与 桥接模式的联系与区别。

适配器的典型用法: 事后补救,解决接口不兼容的问题。

class Adapter implements NewInterface {
private LegacyClass legacyObj;

适配器类实现新接口,但是组合老的实现类。通过老的实现类的方法作为input,经过一定的转换,来返回新接口方法格式的结果。

桥接模式的典型用法:事前规划。选取一个主维度作为主体,去组合其他的维度。
抽象层与实现分离。比如统一的UI框架与不同OS的渲染。统一的数据格式与不同的db 驱动。
或者是多维度的分离,防止类爆炸。比如形状与颜色,车的类型与引擎的类型。

二者也经常结合使用。比如桥接模式定义一个抽象层,如数据存储,然后组合一个Adaptor类型的实现层。

这样在实现一个具体数据存储的时候,可以去组合不同驱动类型的adaptor。

回过头来,简单总结,这个桥接模式就是用抽象组合抽象。从而减少类定义的复杂度。

4.关于单一职责原则和接口隔离原则的练习与区别。
两者都体现了高内聚,低耦合理念。

但是单一职责强调类的职责,比如订单类与支付类的拆分。

接口隔离原则强调接口的拆分,比如飞行功能与汽车行驶的接口功能拆分。

5.访问者模式:
一句话总结: 不想在猫,狗类中写关于 健康检查,喂食等代码。
简单写一个accept 方法。调用入参的Visit。
具体的健康检查,喂食,由入参类负责。

另外一般会有一个动物园类来组合元素集合。并提供依次accept的方法。方便兽医、喂食人员调用。

适合于你有一堆类似的元素(猫狗等),然后你又想将来以不同的方式来批量对待他们。

精髓是将操作从数据结构中分离出来,适用于操作易变,但数据结构稳定的系统。比如编译器,UI框架。
规避场景:数据结构容易变,或者不可预知的场景。即猫狗易变,而且我也不知道啥时候集合里面会多来一种动物。

备忘录类 典型例子是游戏存档
存储游戏状态快照,但是不想让其他人访问,随意修改数据。
Momento 对象,对其他人如玩家提供窄接口,仅对发起人(游戏程序员、GM、或者是数据敏感的GAMEROLE类这样的角色等)提供宽接口。

在java中的实现方案是,将PrivateMomento 设计为 GM类的成员内部类。

GM对外提供的backup restore 都是Momento类型。实际GM进行操作时,强转为PrivateMomento再在内部方法中偷偷操作属性等。

精髓:针对同样一个操作,实现双接口。对不同类暴漏的功能数量不一样。增强安全性。
对于无关的人,我给你一个功能很少的接口类。等到了底层真正执行的时候,你会发现它强转了向下转型了另外一个功能更强大的类。

7.状态模式
把状态抽象成类,对于同一个方法,当前是什么状态干什么事,减少if else 的使用。
比如向前Go订单。-> 现在是下单那就发货,是发货那就签收。

http://www.lryc.cn/news/2402612.html

相关文章:

  • To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R
  • 【基础】每天掌握一个Linux命令 - awk
  • 《UE5_C++多人TPS完整教程》学习笔记37 ——《P38 变量复制(Variable Replication)》
  • AWS API Gateway配置日志
  • Towards Open World Object Detection概述(论文)
  • 轻松备份和恢复 Android 系统 | 4 种解决方案
  • 具备强大的数据处理和分析能力的智慧地产开源了
  • RK3588和FPGA桥片之间IO电平信号概率性不能通信原因
  • 【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制
  • .net jwt实现
  • LangChain【7】之工具创建和错误处理策略
  • 如何在电脑上轻松访问 iPhone 文件
  • Eureka REST 相关接口
  • C语言字符数组输入输出方法大全(附带实例)
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南
  • 每日算法 -【Swift 算法】电话号码字母组合
  • 深入解析YUM与DNF:RPM包管理器的架构演进与功能对比
  • 解决cocos 2dx/creator2.4在ios18下openURL无法调用的问题
  • 精益数据分析(94/126):30/10/10用户参与法则与定价策略的科学制定
  • oss:上传图片到阿里云403 Forbidden
  • Windows系统中如何使用符号链接将.vscode等配置文件夹迁移到D盘(附 CMD PowerShell 双版本命令)
  • 4. 数据类型
  • MySQL基础(二)SQL语言、客户端工具
  • 【贪心、DP、线段树优化】Leetcode 376. 摆动序列
  • CppCon 2015 学习:C++ in the audio industry
  • C++算法-动态规划2
  • 软信天成:数据驱动型背后的人工智能,基于机器学习的数据管理
  • MySQL提升
  • hbase资源和数据权限控制
  • VMWare下设置共享文件,/mnt/hgfs下却不显示共享文件的解决方法