设计模式6大原则详解

设计模式六大原则: 面向对象语言开发过程中,推荐的一些指导性原则(并不是强制要求的)

1. 单一职责原则(Single Responsibility Principle)
2. 里氏替换原则(Liskov Substitution Principle)
3. 依赖倒置原则(Dependence Inversion Principle)
4. 接口隔离原则(Interface Segregation Principle)
5. 迪米特法则 (Law Of Demeter)
6. 开闭原则(Open Closed Principle)

1.单一职责原则(Single Responsibility Principle)

  1. 单一职责原则:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

简单来说单一职责原则就是:一个类只负责一件事儿,一个类不要让他太“累” ;

优点:拆分之后,职责变得单一
          阅读简单,易于维护;
          扩展升级,减少修改,直接增加类;
          方便代码重用的;
          总的来说就是使程序:简单--稳定--强大

缺点:单一职责的成本:类变多了;上端需要了解更多的类

衡量着使用:如果类相对稳定,扩展变化少,而且逻辑简单,违背单一职责也没关系

代码足够简单,就可以稍稍违背;
                     如果不同的职责,总是一起变化,这种是一定要分开的;
 
当然不只是类要支持单一职责原则,下面这些也要支持:

方法:方法多个分支,还可能扩展变化,最好拆分成多个方法;
类:接受输入-数据验证-逻辑计算--数据库操作--日志 为了重用,方便维护升级;
接口:也会把不同的功能接口,独立开来;
类库:把项目拆分成多个类库,重用--方便维护;
项目:一个web解决所有问题:客户端;管理后台;定时服务;远程接口; 还是要拆分;
系统:成熟互联网企业,有N多项目,有很多重复功能,IP库/日志库/监控系统/在线统计。。。;

2. 里氏替换原则(Liskov Substitution Principle)

里氏替换原则:任何使用基类的地方,都可以透明的使用其子类;也就是,继承+不改变行为;

继承:通过继承,子类拥有父类的一切属性和行为,任何父类出现的地方,都可以用子类来代替;
1 子类必须完全实现父类有的方法,如果子类没有父类的某项东西,就断掉继承;
2 子类可以有父类没有的东西,所以子类的出现的地方,不一定能用父类来代替;
3 透明,就是安全,父类的东西换成子类后不影响程序:
     a 父类已经实现的东西,子类不要去new;
     b 父类已经实现的东西,想改的话,就必须用virtual+override 避免埋雷;

  声明变量、参数、属性、字段,最好都是基于基类的,也就是里式替换原则,能在父类声明的东西不要在子类声明;

3. 依赖倒置原则(Dependence Inversion Principle)

依赖倒置原则:高层模块不应该依赖于低层模块,二者应该通过抽象依赖,也就是要依赖抽象,而不是依赖细节;

抽象:抽象类/接口
细节:具体的类

23种设计模式,80%以上跟这个有关

依赖细节:程序写死了,不谈什么扩展;
依赖抽象,更具有通用性,而且具备扩展性;
细节多变的,抽象是稳定的;系统架构基于抽象来搭建,会更稳定更具备扩展性

面向抽象编程, 底层模块里面尽量都有抽象类/接口,
在声明参数/变量/属性的时候,尽量的都是 接口/抽象类

有人说:你说的我都懂,但是我在开发的过程中,好像没有感觉哪里需要抽象?
    其实是因为你的项目还不够麻烦,,如果项目不考虑扩展变化,那确实不需要依赖倒置

4. 接口隔离原则(Interface Segregation Principle)

接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上;
                       实现一个接口的时候,只需要自己必须的功能;

为什么不建立一个大而全的接口,而是要拆分?

因为不能让类型实现自己没有的功能;

为什么要尽量的用同一个接口?

尽量让抽象更具备复用性;

接口拆分是随着项目进程而演变的,一直演变下去,是不是直接拆分成一个接口一个方法得了??
如果真的一个接口一个方法,那也没意义了;

究竟该如何设计呢? 确实需要丰富的经验和对业务的理解:
1 接口不能太大,否则会实现不需要的功能;
2 接口还是要尽量的小, 但是一致的功能是应该在一起的,密不可分的功能不要分开;
   不能过度设计 要考虑清楚业务的边界;
3 接口合并:如果一个业务包含多个固定步骤,我们不应该把步骤都暴露,而是提供一个入口即可;如地图导航,里面有搜索-定位-导航接口,对于用户只要结果导航,所以要把三个接口合并;

5. 迪米特法则 (Law Of Demeter)

迪米特法则(最少知道原则):一个对象应该对其他对象保持最少的了解。

面向对象--类--类与类之间会有交互--功能模块--系统
高内聚,低耦合:高度封装,尽量少的暴露信息,类与类之间减少依赖;
只与直接的朋友通信

去掉内部依赖--降低访问修饰符
门面(外观)模式/中介者模式

6. 开闭原则(Open Closed Principle)

开闭原则:对扩展开发,对修改关闭;
如果有功能扩展变化的需求,希望是增加类而不是修改;
修改会影响原有功能,引入错误;
增加类就不会影响原有的东西;

开闭原则是原则的原则,五大原则是手段,这个是目标;
修改方法--增加方法(修改类)--增加类--增加dll--配置文件;

当然项目设计的时候,其实很难说全部都满足;任何一个项目都有自己的特点;
会在这里有所取舍;

(0)

相关推荐

  • "设计模式我学过呀,就是没用过"

    回复"000"获取大量电子书 写在前面 在开发中,不使用设计模式也不是不可以,但是用好设计模式能帮忙我们更好的去解决实际问题. 其实,我们天天都在和设计模式打交道,很多人却完全不知 ...

  • 面向对象设计原则(SOLID原则)

    一.单一功能(single responsibility) 单一功能原则,也叫单一职责原则.简单来说,就是一个类应该只有一个引起它变化的原因,其中心思想就是面向对象设计原则中的高内聚,低耦合.当分析有 ...

  • 面向对象六大原则

    这篇文章主要讲的是面向对象设计中,应该遵循的六大原则.只有掌握了这些原则,才能更好的理解设计模式. 我们接下来要介绍以下6个内容. 单一职责原则--SRP 开闭原则--OCP 里氏替换原则--LSP ...

  • 掌握设计原则,你就是光(25个问题,你会几个)

    25个问题,你会几个 如何理解单一职责原则? 如何判断职责是否足够单一? 职责是否设计得越单一越好? 什么是开闭原则? 修改代码就一定意味着违反开闭原则吗? 怎样的代码改动才被定义为扩展或者说是修改? ...

  • 经方用药十大“主帅”详解

    一.附子 二.干姜 三.肉桂 四.麻黄 五.桂枝.六.细辛 七.        石膏 八.大黄 九.芒硝 十.黄连. 此十味药品,余暂以十大"主帅"名之,是形容其作用之大也.由于少 ...

  • 传媒类10大专业详解,强烈推荐2019届报考这些院校!

    美术.音乐.播音.表演.编导.舞蹈等各艺术类专业下设有大量的分支专业,具体有哪些呢?这些专业就业前景如何?又有哪些院校值得推荐?近期学艺特长生将向大家详细解析. 艺考传媒类专业那么多,考生究竟可以报哪 ...

  • 高考生物实验大题详解

    实验六 色素的提取和分离 1.原理: 叶绿体中的色素能溶解在有机溶剂丙酮或无水乙醇--提取色素. 各色素在层析液中的溶解度不同,随层析液在滤纸上扩散速度不同--分离色素 2.步骤: (1)提取色素 研 ...

  • 高考生物实验大题详解,看书应该看什么?(上)

    如何看一道题目? 一 纵观全题,审清题意 实验题的逻辑性是很强的,题目中的每一个条件,每一个步骤,都有着紧密的联系.所以,遇到实验题时,通读全题,仔细分析题目的每一个条件.问题,把握好题目前后的相关性 ...

  • 楚庄王问鼎中原的九大名将详解

    三年不飞一飞冲天,楚庄王登位的前三年,为何不处理政事?难道真的是贪玩昏庸吗? 楚庄王登位之初,还不到20岁,国内矛盾重重,只能故意天天喝酒作乐.因为当时国家的实权被宗法大贵族敖氏所掌控,自己并没有操控 ...

  • 古代福建的十大望族详解

    公元前214年,秦始皇发兵平定南越后,出兵闽越,在福建设置闽中郡. 公元207年,东汉在福建设立建安郡. 公元282年,西晋拆建安郡为建安.晋安两郡. 陈朝永定时,陈武帝设闽州,这是福建历史上第一个省 ...

  • 古代甘肃的十大名将详解

    甘肃省位于中国西部地区,地处黄河中上游,境内的河西走廊是连接东西方的重要战略通道,同时甘肃还是古代中国的边防重地,自古以来就是征伐不断之地,这也磨练了一批举世无双的名将,现在就古代甘肃的十大名将进行一 ...

  • 古代辽宁的十大名将详解

    辽宁省位于东北地区的南部,南濒黄.渤二海,辽东半岛斜插于两海之间,西北与内蒙古毗连,东北与吉林省为邻,东南以鸭绿江为界与朝鲜隔江相望.自古以来都是中国的北疆重镇,重兵把守之地,历来都是北方民族之间较量 ...

  • 古代湖南的十大名将详解

    湖南省位于长江中游,省境绝大部分在洞庭湖以南,湘江贯穿省境南北,区位优势明显.湖南的近现代名将层出不穷,将星闪耀,古代湖南也有一批名将比较耀眼,现在就古代湖南的十大名将进行一一详解.排名不分先后,以所 ...