当前位置: 首页 > news >正文

设计模式之6大原则

设计模式之6大原则

一、设计模式6大原则

 

名称

解释

0、单一职责原则(SRP)

就一个类而言,应该仅有一个引起它变化的原因。

一、"开放-封闭"原则(OCP)

在软件设计模式中,这种不能修改,但可以扩展的思想也是最重要的一种设计原则。即软件实体(类、模板、函数等等)应该可以扩展,但是不可修改。

【通俗】:设计的时候,时刻考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。

二、里氏代换原则(LSP)

1.一个软件实体如果使用的是一个父类的话,那么一定适用于该子类,而且他觉察不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。

【一句话】:子类型必须能够替换掉他们的父类型。

三、依赖倒置原则(DIP)

1.高层模块不应该依赖于底层模块。两个都应该依赖抽象。2.抽象不应该依赖于细节,细节依赖于抽象(

【白话】:针对接口编程,不要针对实现编程。

四、接口隔离原则(ISP)

1.使用多个专门的接口比使用单一的总接口总要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。

2.过于臃肿的接口是对接口的污染。不应该强迫客户依赖于它们不用的方法。

五、合成/聚合复用原则(CARP)

尽量使用合成/聚合,尽量不要使用类继承。

【聚合】:表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。

【合成】:一种强的拥有关系,提现了严格的部分和整体的关系,部分和整体的生存周期一致。

六、迪米特法则(LoD)

最少知识原则

强调类之间的松耦合。即:如果两个类不必彼此直接通信,那么着两个类就不应当发送直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

___大部分内容摘自《大话设计模式

1.楼主?题目不是6个设计模式吗?怎么列举了7个?

答:不同的书上列举的不太一样,单一模式原则和接口隔离原则多数都提了一个。本文都列举上,待深入探究后给出详细分析。

2.接口隔离原则与单一职责原则不是相同的吗?

答:错,接口隔离原则与单一职责的审视角度是不相同的。

单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分;

而接口隔离原则要求接口的方法尽量少。例如一个接口的职责可能包含10个方法,这10个方法都放在一个接口中,并且提供给多个模块访问,各个模块按照规定的权限来访问,在系统外通过文档约束“不使用的方法不要访问”,按照单一职责原则是允许的,按照接口隔离原则是不允许的,因为它要求“尽量使用多个专门的接口”,专门的接口指什么?就是指提供给每个模块都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。


from:http://blog.csdn.net/laoyang360/article/details/8066565

相关文章:

  • Cocos2d-x 屏幕适配解决方案
  • Cocos2d-x 3.0游戏开发找小三之搭建开发环境
  • Unity3d的ios项目在场景切换时候Crash的问题
  • Unity3D研究院之Android高通骁龙800以上CPU随机crash
  • iOS第三方开源库的吐槽和备忘
  • iOS常用控件、图片尺寸大集合
  • ios常用操作代码
  • 优秀的开源库
  • GitHub 上都有哪些值得关注学习的 iOS 开源项目?
  • 为iPhone 6设计自适应布局
  • 如何用Cocos2d-JS制作一个微信报名宣传页
  • cocos2dx-js学习笔记、官方tests示例
  • Unity3d+Jenkins 自动编译iOS、Android版本
  • 解决iOS应用内购买报错:invalidProductIdentifiers
  • iOS 应用内付费(IAP)开发步骤
  • 【Leetcode】101. 对称二叉树
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 30天自制操作系统-2
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • create-react-app项目添加less配置
  • JS函数式编程 数组部分风格 ES6版
  • JWT究竟是什么呢?
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • spring boot下thymeleaf全局静态变量配置
  • vue 个人积累(使用工具,组件)
  • vue-router的history模式发布配置
  • webpack+react项目初体验——记录我的webpack环境配置
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 安装python包到指定虚拟环境
  • 反思总结然后整装待发
  • 解析 Webpack中import、require、按需加载的执行过程
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 学习Vue.js的五个小例子
  • 云大使推广中的常见热门问题
  • Linux权限管理(week1_day5)--技术流ken
  • # 透过事物看本质的能力怎么培养?
  • #单片机(TB6600驱动42步进电机)
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $L^p$ 调和函数恒为零
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • .Mobi域名介绍
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查