点击关注“有赞coder”
获取更多技术干货哦~
作者:吕浩
部门:有赞美业
提到设计模式,有一个非常有意思的现象: 理论学习中,几乎所有的开发人员都认为它非常有用很重要。 工作实践中,绝大部分开发人员在项目中找不到合适的应用场景。 设计模式学了一遍又一遍,却毫无用武之地。大概设计模式最好的归宿,就是存在程序员的深深的脑海里。
近10年来,软件生产效率有了巨大的提升。抛开硬件的因素,很大程度上是因为面向对象的普及,以及配套工具体系(例如框架)的完善。以至于在日常开发中,很多人会认为框架解决了所有问题,业务不过是CRUD。
问题=>模式
的思路来分析下在这个过程中可能会遇到的问题:[建造者模式]
[工厂模式]
[原型模式]
[单例、享元模式]
is-a
) = 实现( like-a
) > 组合( part-a
) > 聚合( contains-a
) > 关联( has-a
) > 依赖( use-a
)。泛化,比较好理解,是类与类之间或者接口与接口之间的继承关系。
实现,也比较常见,类与接口之间的关系。
组合,是一种强关联,强调部分是整体不可分割的一部分,具有相同的生命周期。例如手是身体的一部分。
聚合,是一种组合稍弱的强关联,强调个体相对于集体的独立性,个体组成了集体,两者生命周期是独立的。例如独立个体的人,聚在一起,形成了各种团体组织。
关联,强调的是拥有关系,是实际存在的逻辑关联。例如夫妻双方,互相为对方的配偶,两者之间关系为关联关系。 - 依赖,是一种耦合度较低的关系,这种关系一般是偶然性的、临时性的。例如我们使用手机打游戏,我们依赖了手机,本质上我们跟手机是不存在逻辑联系的。
is-a
的静态关系。继承同时也具备复用属性与行为的能力。like-a
的动态关系,在运行时体现出不同。依赖倒置原则:面向接口编程,不要针对实现编程。实现意味着应对变化的能力下降,尽量延迟到调用时再具体化。
开闭原则:对扩展开放,对修改关闭。比较好理解,扩展新增引入的风险相对修改更可控一些。修改往往意味着,系统扩展性不够。
里氏替换原则:继承父类的目的是为了复用。高质量的继承关系,是衍生类可以完全替换掉基类,并且系统的行为不受到影响。如果子类不能完全替换父类,说明继承是不彻底的,复用的目的就没有达到。
单一职责原则:一个类应该只承担一个职责。承担的职责过多,职责之间可能会相互耦合。这里最难的就是划分职责,职责必须恰如其分地表现实体的行为。比如用户账号可以修改基础信息,会员可以持有会员卡。如果不加以区分,只抽象一个用户实体包括所有的行为,显然是不合适的。
接口隔离原则:适度细化接口,接口的行为尽量少。分治的思想,降低复杂性,系统更可控。
迪米特法则:一个类对依赖的类知道的越少越好。本质目的是将复杂度控制在一定范围内。
组合/聚合复用原则:复用即可以通过继承实现,也可以通过组合 / 聚合实现。区别在于,继承表达 is-a
的逻辑关联,目的在描述结构,而不是复用。