设计模式
Single Responsibility Principle | SRP | 单一职责原则 | 一个类只干一件事,实现类要单一 | 便于理解,提高代码的可读性 |
Open Closed Principle | OCP | 开闭原则 | 对扩展开放,对修改关闭 | 降低维护带来的新风险 |
Liskov Substitution Principle | LSP | 里氏替换原则 | 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 | 防止继承泛滥 |
Law of Demeter | LoD | 迪米特法则 | 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 | 只和朋友交流,不和陌生人说话,减少代码臃肿 |
Interface Segregation Principle | ISP | 接口隔离原则 | 一个接口只干一件事,接口要精简单一 | 功能解耦,高聚合、低耦合 |
Dependence Inversion Principle | DIP | 依赖倒置原则 | 高层不应该依赖低层,要面向接口编程 | 更利于代码结构的升级扩展 |
Composite Reuse Principle | CRP | 合成复用原则 | 尽量使用组合或者聚合关系实现代码复用,少使用继承 | 降低代码耦合 |
控制反转 IoC
依赖注入优势,官网给的总结:
重用类以及分离依赖项:更容易换掉依赖项的实现。由于控制反转,代码重用得以改进,并且类不再控制其依赖项的创建方式,而是支持任何配置。
易于重构:依赖项成为 API Surface 的可验证部分,因此可以在创建对象时或编译时进行检查,而不是作为实现详情隐藏。
易于测试:类不管理其依赖项,因此在测试时,您可以传入不同的实现以测试所有不同用例。
自动注入框架: Dagger, Hilt, Coin
依赖注入表现为生成依赖对象的过程(new)在类的外部。
比如需要鸡蛋,养鸡场负责产蛋,然后买来,而不是自己养鸡生蛋,或者把养鸡场的鸡抱来生蛋。
三种注入方法: 构造函数注入,属性注入,方法注入(其目的都是实现控制反转)
https://zhuanlan.zhihu.com/p/439238818
- 关注点分离(SOC / Separation Of Concerns) 分层合理,提高可测性
- 数据驱动 UI(Reactive)
- 唯一真相源(SSOC / Single Source Of Truth)
UI Controller 层 - Activity 和 Fragment
ViewModel 层 - MVVM 的 VM、MVP 的 P,也可以做 UI 的数据适配
Repository 层 - 作为 SSOC,是一个 Facade 模式,对上层屏蔽了数据的来源,数据持久化策略向上透明
创建型 | 简单工厂 | 参数化用if区分 |
分离职责 简化记忆 提高灵活性 |
工厂职责过重 复杂度增加 扩展困难 无法继承 |
||
工厂方法 | 子类决定实例化哪个类 |
封装细节 多态 扩展性好 |
类数量多 增加理解难度 |
|||
抽象工厂 | 子工厂类决定实例化哪个类 |
隔离 增加产品族容易 |
增加产品等级麻烦 | |||
单例 |
饿汉 懒汉,二次检查 嵌套内部静态类 枚举 |
构造函数私有化 静态成员 共有静态方法 |
唯一实例 节省资源
|
扩展困难 职责过重 GC导致重新实例化 |
||
建造者 | 汇总创建方法 |
封装细节 扩展性好 |
范围受限 建造者多 |
|||
原型 |
深克隆 浅克隆 |
简化创建过程 扩展性好 简化创建结构 保存状态 |
修改不方便 深克隆需要嵌套类支持 |
|||
结构型 | 代理 | |||||
适配器 | ||||||
桥接 | ||||||
装饰者 | ||||||
外观 | ||||||
组合 | ||||||
享元 | ||||||
行为型 | 模板方法 | |||||
策略 | ||||||
命令 | ||||||
观察者 | ||||||
责任链 | ||||||
状态 | ||||||
迭代器 | ||||||
访问者 | ||||||
备忘录 | ||||||
解释器 |