zoukankan      html  css  js  c++  java
  • 《设计模式之禅》六大设计原则

    设计模式是什么?

    它是一套理论,由软件界的先辈们(The Gang of Four:包括Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)总结出的一套可以反复使用的经验,HuDun Demo。

    它可以提高代码的可重用性,增强系统的可维护性,以及解决一系列的复杂问题。

    6大设计原则

     单一职责原则

     里氏替换原则

     依赖倒置原则

     接口隔离原则

     迪米特法则

     开闭原则

    单一职责原则的英文名称是Single Responsibility Principle,简称是SRP

    单一职责原则的定义是:应该有且仅有一个原因引起类的变更。

    什么是里氏替换原则呢?它有两种定义:

    ● 第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of

    type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)

    ● 第二种定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的对象。)

    第二个定义是最清晰明确的,通俗点讲,只要父类能出现的地方子类就可以出现,而且

    替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但

    是,反过来就不行了,有子类出现的地方,父类未必就能适应。

    里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义。

    1.子类必须完全实现父类的方法

    注意 在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明

    类的设计已经违背了LSP原则。

    注意 如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发

    “畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

    2.子类可以有自己的个性,也就是方法和属性

    3.覆盖或实现父类的方法时输入参数可以被放大

    方法中的输入参数称为前置条件,里氏替换原则也要求制定一个契约,就是父类或接口,这种设计方法也叫做Design by Contract(契约设计),与里氏替换原则有着异曲同工之妙。契约制定了,也就同时制定了前置条件和后置条件,前置条件就是你要让我执行,就必须满足我的条件;后置条件就是我执行完了需要反馈,标准是什么。

    4. 覆写或实现父类的方法时输出结果可以被缩小

    依赖倒置原则的定义

    依赖倒置原则(Dependence Inversion Principle,DIP

    依赖倒置原则的原始定义是:

    High level modules should not depend upon low level modules.Both should depend upon

    abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.

    翻译过来,包含三层含义:

    ● 高层模块不应该依赖低层模块,两者都应该依赖其抽象;

    ● 抽象不应该依赖细节;

    ● 细节应该依赖抽象。

    高层模块和低层模块容易理解,每一个逻辑的实现都是由原子逻辑组成的,不可分割的

    原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是可以加上一个关键字new产生一个对象。依赖倒置原则在Java语言中的表现就是:

    ● 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过

    接口或抽象类产生的;

    ● 接口或抽象类不依赖于实现类;

    ● 实现类依赖接口或抽象类。

    更加精简的定义就是“面向接口编程”——OOD(Object-Oriented Design,面向对象设

    计)的精髓之一。

    采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风

    险,提高代码的可读性和可维护性。

    思考依赖倒置对并行开发的影响。两个类之间有依赖关系,只要制定出两者之

    间的接口(或抽象类)就可以独立开发了,而且项目之间的单元测试也可以独立地运行,而

    TDD(Test-Driven Development,测试驱动开发)开发模式就是依赖倒置原则的最高级应

    用。

    依赖的三种写法

    1.构造函数传递依赖对象

    在类中通过构造函数声明依赖对象,按照依赖注入的说法,这种方式叫做构造函数注

    入。

    2.Setter方法传递依赖对象

    在抽象中设置Setter方法声明依赖关系,依照依赖注入的说法,这是Setter依赖注入。

    3.接口声明依赖对象

    在接口的方法中声明依赖对象,3.2节的例子就采用了接口声明依赖的方式,该方法也

    叫做接口注入。

    最佳实践

    依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,

    不互相影响,实现模块间的松耦合怎么在项目中使用这个规则?遵循以下的几

    个规则:

    ● 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备

    这是依赖倒置的基本要求,接口和抽象类都是属于抽象的,有了抽象才可能依赖倒置。

    ● 变量的表面类型尽量是接口或者是抽象类

    ● 任何类都不应该从具体类派生

    ● 尽量不要覆写基类的方法

  • 相关阅读:
    缓存一致性问题
    缓存雪崩
    mysql Replication机制
    数据库水平切分、拆库拆表
    mysql分表和分区实际应用简介
    mysql中间件
    mysql基础知识
    go语言redis使用(redigo)
    nginx location配置与rewrite配置
    PDO驱动使用
  • 原文地址:https://www.cnblogs.com/future-zmy/p/6238570.html
Copyright © 2011-2022 走看看