经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式六大原则:单一职责原则
来源:cnblogs  作者:酷学大叔  时间:2019/9/10 10:57:49  对本文有异议

目录: 

  设计模式六大原则:单一职责原则

  设计模式六大原则:接口隔离原则 

  设计模式六大原则:依赖倒置原则

  设计模式六大原则:里氏替换原则

  设计模式六大原则:迪米特法则

  设计模式六大原则:开闭原则

单一职责原则:

  对象不应承担太多功能,正如一心不能而用,比如太多的工作(种类)会使人崩溃。唯有专注才能保证对象的高内聚;唯有唯一,才能保证对象的细粒度。

解决问题:

  假如有A和B两个类,当A需求发生改变需要修改时,不能导致B类出问题。

现状:

  在实际情况很难去做到单一职责原则,因为随着业务的不断变更,类的职责也在发生着变化,即职责扩散。如类A完成职责P的功能,但是随着后期业务细化,职责P分解成更小粒度的P1与P2,这时根据单一职责原则则需要拆分类A以分别满足细分后的职责P1和P2。但是实际开发环节,若类的逻辑足够简单,可以在代码上级别上违背单一职责原则;若类的方法足够少,可以在方法级别上违背单一职责原则。

经典案例:

  用一个类描述动物呼吸的场景

  1. 1 namespace MyDemo
  2. 2 {
  3. 3 internal class Animal
  4. 4 {
  5. 5 public void breath(string animal)
  6. 6 {
  7. 7 Console.WriteLine($"{animal}呼吸空气");
  8. 8 }
  9. 9 }
  10. 10 }
view code
  1. 1 namespace MyDemo
  2. 2 {
  3. 3 internal class Program
  4. 4 {
  5. 5 private static void Main(string[] args)
  6. 6 {
  7. 7 Animal animal = new Animal();
  8. 8 animal.breath("??");
  9. 9 animal.breath("??");
  10. 10 animal.breath("??");
  11. 11 animal.breath("??");
  12. 12 }
  13. 13 }
  14. 14 }
view code

  从示例可以发现,Animal类已不足以支持客户端所需职责,因为??吃水。若遵循单一职责原则,则需要拆分Animal类。 

  1. 1 internal class Terrestrial
  2. 2 {
  3. 3 public void breath(string animal)
  4. 4 {
  5. 5 Console.WriteLine($"{animal}呼吸空气");
  6. 6 }
  7. 7 }
  8. 8
  9. 9 internal class Aquatic
  10. 10 {
  11. 11 public void breath(string animal)
  12. 12 {
  13. 13 Console.WriteLine($"{animal}吃水");
  14. 14 }
  15. 15 }
view code 
  1. 1 internal class Program
  2. 2 {
  3. 3 private static void Main(string[] args)
  4. 4 {
  5. 5 Terrestrial terrestrial = new Terrestrial();
  6. 6 terrestrial.breath("??");
  7. 7 terrestrial.breath("??");
  8. 8 terrestrial.breath("??");
  9. 9
  10. 10 Aquatic aquatic = new Aquatic();
  11. 11 aquatic.breath("??");
  12. 12 }
  13. 13 }
view code

  这时你会发现,若针对简单的业务逻辑来说,若每次细分都需要拆分的话实在是太繁琐了,而且服务端与客户端代码都需要做相应的修改。所以直接在原先类中进行修改,虽然违背了单一职责原则,但花销小。

  1. 1 internal class Animal
  2. 2 {
  3. 3 public void breath(string animal)
  4. 4 {
  5. 5 if ("??".Equals(animal))
  6. 6 {
  7. 7 Console.WriteLine($"{animal}吃水");
  8. 8 }
  9. 9 else
  10. 10 {
  11. 11 Console.WriteLine($"{animal}呼吸空气");
  12. 12 }
  13. 13 }
  14. 14 }
View Code

优点:

  1、降低类的功能复杂度

  2、提高系统的可维护性

  3、变更风险低

参考:https://blog.csdn.net/zhengzhb/article/details/7278174

原文链接:http://www.cnblogs.com/az4215/p/11462818.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号