• 设计模式之禅2之六大原则


    面向对象原则

         1单一职责原则SRP (single ResponSibility Principle)

                       1.类的复杂性降低,实现什么职责都有明确的定义

                       2.可读性提高

                       3.可维护性提高

                       4.风险降低

         2.里氏替换原则

               定义

                                Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类

                     前置条件:契约设计

                                就是想你要拿我的东西,得满足我的条件经过我的同意

                                1.      如果子类不能够完整的实现父类的方法,或者父类的某些方法在子类中已经发生畸变,则建议断开父子继承关系,采用依赖,聚合、组合等关系代替

                                2.      有子类出现的地方,父类未必可以出现()

                                3.      子类继承父类,是可以与父类的方法重载的,但是参数值一定要比原来的参数范围大,但是仍然也是调用父类的方法(如果小的话,就会引起混乱)

                                4.      重写或者显示父类的方法时输出结果可以被缩小

                 好处:

                                1.代码共享,减少创建类的工作,每个子类都有父类的方法和属性

                                2.提高代码的重用性

                                3.代码的可扩展性

                                4.提高产品或者项目的开放性

                坏处:

                                1继承是入侵的,只要是继承,就必须有父类的方法和属性

                                2.降低代码的灵活性

                                3.增强了耦合性

         3.依赖倒置原则

               定义

                                Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需 要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思 出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能.

                                1高层模块不应该依赖低层模块

                                2. 抽象不应该依赖细节

                                3.细节应该依赖抽象

               在java语言中的表现

                                1.      模块之间的依赖通过抽象发生,实现类之间不发生直接依赖关系,其依懒关系是通过接口或抽象类产生的

                                2.      接口或抽象类不依赖实现类

                                3.      面向接口编程

               好处:

                                1.      减少类的耦合性

                                2.      提供系统的稳定性

                                3.      降低并行开发带来的风险

                                4.      提高代码的可读性和可维护性

         4.接口隔离原则

               定义

                                Interface Segregation Principle(ISP),接口隔离原则,“将大的接口打散成多个小接口”,这样做的好处很明显。

                       两种接口:

                                1.实例接口(类)

                                2.类接口(用interface)

                       1.客户端不应该依赖他不需要的接口

                       2.类之间的依赖关系应该建立在最小接口上(接口要纯洁)

                       3.接口要高内聚(高内聚就是提高接口,类,模块的处理能力,减少对外的交互)

                       (不讲条件,立刻完成任务)

               最佳实践

                                1.      一个接口只服务于一个子模块或者业务逻辑

                                2.      通过业务逻辑去压缩接口中的public方法,经常回顾接口,瘦接口

                                3.      已经被污染的接口尽量去修改,若修改风险大,则采用适配器模式进行转化处理

                                4.      了解环境,拒绝盲从(根据需求去设计)

         5.迪米特法则(最少知识原则)

                       Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到 正式运用,所以定义为迪米特法则。它讲 的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则

                       1.      只和朋友交流(朋友:对象和对象之间有耦合关系就叫做朋友关系)

                       2.      和最近的朋友交流(要保持距离,朋友妻不可欺)

                       3.      自己的就是自己的(如果一个方法放在本类中,既不产生类间关系,也对本类不产生负面影响,那么就放置在本类中)

                       4.      谨慎使用Serrializable

         6开闭原则

                       Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。

                       什么是软件实体:

                       1.      项目或者软件产品按照一定的逻辑划分的模块

                       2.      抽象和类

                       3.      方法

  • 相关阅读:
    Oracle 按一行里某个字段里的值分割成多行进行展示
    Property or method "openPageOffice" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by
    SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
    Maven 设置阿里镜像
    JS 日期格式化,留作参考
    JS 过滤数组里对象的某个属性
    原生JS实现简单富文本编辑器2
    Chrome控制台使用详解
    android权限(permission)大全
    不借助第三方网站四步实现手机网站转安卓APP
  • 原文地址:https://www.cnblogs.com/thehugo/p/5629192.html
Copyright © 2020-2023  润新知