.NET 设计模式的六大原则理论知识
1. 单一职责原则(SRP)(Single Responsibility Principle)
2. 里氏替换原则(LSP)(Liskov Substitution Principle)
3. 依赖倒置原则(DIP)(Dependence Inversion Principle)
4. 接口隔离原则(ISP)(Interface Segregation Principle)
5. 迪米特原则(LOD)(Law Of Demeter)
6. 开闭原则(OCP)(Open Closed Principle)
1:单一职责原则(一个类只做一件事)
应用场景:
类T负责两个不同的职责:P1职责,P2职责。当P1需求发生变法时而需要修改类T时,就有可能导致原本运行正常的P2发生故障。
遵循单一原则,把P1跟P2分成两个类,每个类只关注一件事情避免因为需求的修改而引发不必要的故障
什么情况下可以违背单一职责原则:
只要逻辑足够简单,就可以在方法级别上违背单一职责原则
如果一个类足够简单,方法够少,就可以在类级别上违背单一职责原则
杂话:各种级别(方法/类/接口/类库/项目/系统)
优点:
1 类逻辑变得简单
2 代码稳定,可扩展性高
缺点:
1 代码会变多
2:里氏替换原则(任何使用基类的地方,其子类都可以透明的使用(继承,多态))
如果子类不能拥有父类的全部属性和行为,断掉继承
如果子类要修改父类的行为,使用override/virtual
总结来说,里氏替换原则就是规范了继承的使用
3:依赖倒置原则(上层模块不直接依赖下层模块,二者应通过抽象依赖(抽象类/接口类))
依赖抽象(抽象类/接口类),而不是依赖细节(实现类)
相对于细节,依赖抽象更稳定
基于抽象的架构,更稳定
杂谈:经常听到的几个词
1 控制反转(IOC):把依赖交给第三方容器来完成 (目的)
2 依赖注入(DI):实现控制反转的一种手段 (行为)
4:接口隔离原则(客户端不应该依赖于它不需要的接口,一个类对另一个类的的依赖应该建立在最小的接口上)
不要使用大而全的接口,这样导致实现不需要的方法
也不能拆分的太细,这样会导致使用不便
关于接口隔离原则,具体情况还需要根据业务需求来定,没有一个同一标准,该拆该合,都得需要自己度量
5:迪米特法则(最少知道原则)(一个对象只于关系最密切的朋友进行通讯,高内聚,低耦合)
类于类之前,要避免不必要的依赖
学校,老师,班级,学生四个类
学校只与老师通讯,老师只跟班级通讯,不要学校在关联老师的同时,又关联班级,这样会增加依赖、
场景:老师类中有一个班级的集合,班级类中有一个学生的集合
错误做法:在老师类中写一个方法,遍历出所有班级,在遍历中,又根据班级遍历出所有学生(这种写法虽然很爽,但是增加了不必要的依赖)
正确做法:在老师类中写一个方法,在班级类中写一个方法,老师类中遍历出所有班级,在遍历中在根据班级调用班级类中自身的方法获取所有的学生(减少了不必要的依赖)
杂谈:类与类的关系
纵向关系:继承 实现
横向关系:依赖(方法内部) 关联 组合 聚合(后三个:方法返回/参数 属性)
6:开闭原则(开放扩展,关闭修改)
没有任何的指导意义,只能算是一个愿景,架构的最理想状态
其他五个原则,都是为了辅助开闭原则,从而达到真正的理想状态
总结
1:六大原则并不是指具体的技术或者应用,而是一个指导性的原则,如何遵循六大原则需要自己度量,相当于一个建议,并不一定必须遵守六大原则,根据业务需求,自己做取舍
2:真正的业务需求中,往往会出现遵循了这个原则,却违反了另一个原则,具体侧重哪个原则,还要根据业务需求来定,不要盲目的追求。
3:尽可能的遵循六大原则来写代码,使你的应用变得健壮,扩展性高,易维护。
.NET 设计模式的六大原则理论知识的更多相关文章
- C#之设计模式之六大原则(转载)
设计模式之六大原则(转载) 关于设计模式的六大设计原则的资料网上很多,但是很多地方解释地都太过于笼统化,我也找了很多资料来看,发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂,因此转载过来 ...
- 设计模式之六大原则——接口隔离原则(ISP)
设计模式之六大原则——接口隔离原则(ISP) 转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- java中的设计模式及其六大原则
设计模式分类: 一共分为3大类:创造型模式.结构型模式.行为型模式. 创造型模式:工厂方法(FactoryMethod).抽象工厂模式(AbstractFactory).建造者模式(Builder). ...
- 设计模式值六大原则——迪米特法则(LoD)也称为最少知识原则(LKP)。
定义: 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP). 一个对象应该对其他对象有最少的了解.通俗地讲,一个类应该对 ...
- 设计模式之六大原则——迪米特法则(LoD,LKP)
转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793000.html 定义: 迪米特法则(Law of Demeter,LoD)也 ...
- C#之设计模式之六大原则
一.单一职责原则 原文链接:http://blog.csdn.net/lovelion/article/details/7536542 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小. ...
- 0 Java实现 一篇文章说尽设计模式之六大原则
我们知道,设计模式很有用,学好设计模式不但能让你写出更简洁,优雅的代码,还能使得代码的结构更清晰,也更有利于扩展 当然设计模式也不是万能的,一成不变的.设计模式只是前人总结出来的一种经验,一种特定问题 ...
- 设计模式之六大原则——开闭原则(OCP)
转载于: http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...
随机推荐
- 关于iconfont字体图标的使用
今天用iconfont遇到了字体图标的使用问题.关于使用字体图标的方式在这里有介绍三种方式(css和js的引入和平时一样) 首先你要分清是用单个字体图标icon,还是多个字体图标icon 关于使用代码 ...
- 数据库 MySQL进阶之索引
数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...
- asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录
一.先从M部分写起(Modles\DAL\BLL) 1.Modles 实体类:上次实体类已经搞定. 2.DAL 数据访问类类 (1)通用数据数据访问类: A: 先编写数据连接字符串,写到网站根目录W ...
- Hadoop问题:The auxService:mapreduce_shuffle does not exist
问题描述:The auxService:mapreduce_shuffle does not exist INFO mapreduce.Job: Task Id : attempt_146180833 ...
- [知了堂学习笔记]_ajax的两种使用方式
一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...
- LINUX下文件编译
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 2017-06-29(cat tac more less head tail)
cat 查看文件内容 cat -A 相当于-vET的整合参数,可列出一些特殊的字符,而不是空白而已 -b 列出行号,空白行不标号 -E 将结尾的断行字符 $ 显示出来 -n 列出行号,空 ...
- java常用类--与用户互动
运行java的参数: 主方法:public static void main(String[] args){}:为了让JVM可以自由调用main方法,使用public修饰,JVM通过类来调用main方 ...
- js实现最短时间走完不同速度的路程
题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...