前言:
很多架构在项目初的时候看不出破绽;只有当项目维护和扩展越来越难的时候,才真正意识到—— 设计模式不是“装饰”,而是“地基” 。
abstract class BaseCustomView : View {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
protected abstract fun onRefreshView()
}
子类实现onRefreshViwe的具体业务逻辑,表面看这没有问题,但随着项目复杂度提升,我发现:
这样的设计,很明显违背了设计模式中的若干设计原则
从单一职责原则触发,即:
从开闭原则出发,即:
修改所有子类 onRefreshViwe();
从控制反转确实出发,即
abstract class BaseCustomView : View {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
/**
* 外部调用的统一入口,包含基础逻辑
*/
final fun refreshView() {
// 基类统一逻辑
invalidate() // 或其他通用刷新逻辑
// 调用子类的实际逻辑
onRefreshView()
}
/**
* 子类重写这个方法,而不是原来的 onRefreshView()
*/
protected abstract fun onRefreshView()
}
优化后方案统一入口,控制权回归基类,子类只关注差异逻辑,提升维护性与可控性。
设计让流程控制权下放给了子类和外部,牺牲了封装性和扩展性,导致架构可控性差、通用逻辑难以集中、维护代价高。
这其实是一个很小的项目架构的问题,在日常的工作会出现无数的这样的问题,解决方法也不只是我说的那样,如果不嫌麻烦,单独处理所有子类也是一种处理的技术手段,技术手段服务于项目这没毛病,只是更好的架构能节省更多的时间和精力。
为什么设计模式“知道却用不上”?
设计模式在初期看起来“多余”
但问题是,不是设计模式太复杂,而是项目现在太简单 —— 一旦复杂度上来,设计失控的代价就暴露了。 写起来“方便”的做法,往往是“技术债”起点
| 场景 | 痛点 | 推荐模式 | 作用 |
|---|---|---|---|
| View 刷新流程不统一 | 控制权分散 | 模板方法模式 | 统一入口,流程可控 |
| 同一功能多种变化 | 逻辑难以复用 | 策略模式 | 可切换刷新策略 |
| 初始化参数复杂 | 构造混乱 | 建造者模式 | 解耦构造与表现 |
| 多模块状态通知 | 回调混乱 | 观察者模式 | 解耦通知与响应方 |
| 复杂条件处理 | if-else 增长 | 状态模式 / 责任链 | 流程可扩展,职责清晰 |
设计模式不是“高级标签”,而是降低维护成本、统一团队协作的结构基础。
| 原则 | 核心思想 | 对应优化点 |
|---|---|---|
| 单一职责原则(SRP) | 一个类只负责一项职责 | 降低类复杂度 |
| 开闭原则(OCP) | 对扩展开放,对修改关闭 | 支持灵活扩展 |
| 里氏替换原则(LSP) | 子类能替代父类使用 | 提升继承可靠性 |
| 依赖倒置原则(DIP) | 依赖抽象而非细节 | 降低模块耦合 |
| 接口隔离原则(ISP) | 接口尽量小而专一 | 提高接口清晰度 |
| 迪米特法则(LoD) | 最少知道原则 | 降低对象之间的耦合 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-3088189/ ,如需转载,请注明出处,否则将追究法律责任。