前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(一):单一职责原则

设计模式(一):单一职责原则

原创
作者头像
xujjj
修改2019-06-28 19:11:22
8020
修改2019-06-28 19:11:22
举报
文章被收录于专栏:IT界的泥石流IT界的泥石流

什么是单一职责原则?

定义:应该有且仅有一个原因引起类的变更

为什么要有单一职责原则?

单一职责原则为我们提供了一个编写程序的思想,要求我们在编写类,抽象类,接口时,要使其功能职责单一,将导致其变更的因素缩减到最少。如果一个类的职责过多,则多个职责耦合在一起,那么就会有多个因素导致这个类发生变化,并且一个职责的变化可能会影响到其他的职责,不利于可重用性。

单一职责具有以下优点:

  • 降低类的复杂度;
  • 提高类的可读性,提高系统的可维护性;
  • 降低变更引起的风险;

单一职责的实现与思考

例:有一个需求要求实现:根据原材料加工生产出产品 A 和产品 B

可见通过 productA 和 productB 方法是可以正常加工生产出 A 产品和 B 产品,现由于 A 产品销量不好,工厂决定将 A 产品材料加工规则改变,B 产品不变。则按照上面代码的逻辑,B 产品也会使用新的材料加工规则,故不符合新的需求。

我们可以看出 ProductFactory 这个类有两个引起其发生变化的因素:A 产品更改因素和 B 产品更改因素,这就与单一职责原则相违背。

所以对于工厂的需求,按照单一职责原则我们应该这样设计:

将原先的 ProductFactory 设计成接口,通过实现该接口生成 AProductFactory类和 BProductFactory 分别生产 A 和 B

通过以上代码,我们可以发现无论任何一个产品改动的时候,也不会影响到其他产品的生产,即使后续新增产品,也可以横向添加XProductFactory 生产产品。

但是很遗憾 ProductFactory 依旧不是职责单一的,从纵向方向来看,ProductFactory 具有颗粒更小的职责:材料加工,生产产品的职责。为了贯彻单一职责的思想,我们将两个职责设计成两个接口

通过实现 IProductFactory,IMaterialProcessing 两个接口实现材料加工类和产品工厂类,通过对应的产品工厂类生成产品。至此代码已符合职责单一原则,显而易见地这也从一个类即可实现的功能变成六个类去实现,若只是单单几个小功能可以如上设计。而对于功能繁多的中大型系统而言,如此设计会导致功能实现繁琐,后期也不利于维护。

规矩是死的,人是活的

我们在接口设计的时候需要尽量做到职责单一,生搬硬套单一职责原则会引起类的爆增,不利于维护同时加大系统的复杂性。单一职责最难划分的是职责,类的职责和变更因素因项目而不同,因环境而不同,并不是要求类的功能拆分的越细越好,对类的功能细分需要我们有足够的开发经验和能力去具体分析。

下期文章《设计模式之里氏替换原则》

更多知识干货,欢迎关注我们的微信公众号:IT界的泥石流

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是单一职责原则?
  • 为什么要有单一职责原则?
  • 规矩是死的,人是活的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档