C#设计模式原则
原则的诞生:
面向对象:封装、继承、多态三大支柱蕴含了用抽象来封装变化,降低耦合,实现复用的精髓;
封装:隐藏内部的实现,保护内部信息;
继承:实现复用,归纳共性;
多态:改写对象行为,实现更高级别的继承
要实现这些目的,就必须遵守一些原则:封装变化、对接口编程、少继承多聚合
实现系统的可扩展、可复用、灵活性好、维护性好
一、开-闭原则(ocp)
1.核心思想:软件应该是可扩展的,而不可修改的
2.对扩展开发:有新的需求或变化时,可以对现有代码进行扩展,以适应新情况
3.对修改关闭:类一旦设计完成,就可以单独完成自己的工作,而不要再对类进行任何修改。
4.实现方式:抽象,多态,继承,接口
二、单一职责原则(srp)
1.目的:如果你有多个原因去改变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类
2.单一职责原则
.一个类应该只受一种变化的影响
.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这些个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。
.优点:消除耦合,减小因需求变化引起代码僵化性臭味
.使用srp注意点:
(1).一个合理的类,应该仅有一个引起它变化的原因,即单一职责;
(2).在没有变化征兆的情况下应用srp或其他原则是不明智的;
(3).在需求实际发生变化时就应该应用srp等原则来重构代码;
(4).使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理代码;
(5).如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很强烈,那就应该用facade或proxy模式对代码重构
三、接口隔离原则(ISP)
1.目的:当我们设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。
2.接口隔离原则:表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。
四、里氏代换原则(LSP)
1.核心思想:子类必须能够替换基类
2.在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作
3.目的:当我们设计程序模块时,我们会创建一些类层次结构,然后我们通过扩展一些类来创建他们的子类,我们必须确保基类的引用可以被子类替换而不影响模块的功能,否则当我们在已有程序模块中使用他们时将会产生不可预料的结果
示例:
public class Father
{
public string type;
public Father()
{
type = "father";
}
/// <summary>
/// 创建虚方法
/// </summary>
public virtual void Method()
{ } }
public class Son:Father
{
public Son()
{
type = "son";
}
/// <summary>
/// 重写父类虚方法
/// </summary>
public override void Method()
{ }
public static void DoSomeThing(Father f)
{
f.Method();
}
}
注:如果Method()被实现为虚方法,并且在子类中可以被重写,则传入DoSomeThing的参数既可以是父类类型也可以是子类类型,子类完全可以代替父类在此调用自己的方法
总结:Liskov替换原则是关于继承机制的设计原则,违反了Liskov替换原则必然导致违反开闭原则;Liskov替换原则能够保证系统具有良好的扩展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期间的类型判断。子类必须满足基类和客户端对其行为的约定,客户端对行为的期望在子类和基类中必须保持一致。
五、依赖倒转原则(DIP)
(1)、目的:在一个应用程序中,我们有一些实现了基础的,主要的操作的底层类和一些封装了复杂逻辑的上层类。实现这种结构的很自然的方式就是,先编写底层类,完成后再编写复杂的上层类。因为上层类是由其他东西定义的,所以这看起来是一种很合理的方式。但是这不是一个灵活的设计,如果我们需要替换一个底层类时会发生什么?
(2)、依赖:所谓依赖,举例:一个类Person,另一个类Car,如果Person的某个方法比如说drive,需要引用Car,则称Person类依赖于Car类
六、组合优先于继承
(1)继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
(2)组合:通过创建一个由其他对象组合的对象来获得新功能的重用方法,新功能的获得是通过调用组合对象的功能实现的,有时又叫聚合
(3)继承与组合:继承与子类之间是“ls-a”的关系;组合与其它类之间是“Has-a”的关系
C#设计模式原则的更多相关文章
- C#软件设计——小话设计模式原则之:依赖倒置原则DIP
前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...
- C#软件设计——小话设计模式原则之:单一职责原则SRP
前言:上篇C#软件设计——小话设计模式原则之:依赖倒置原则DIP简单介绍了下依赖倒置的由来以及使用,中间插了两篇WebApi的文章,这篇还是回归正题,继续来写写设计模式另一个重要的原则:单一职责原则. ...
- C#软件设计——小话设计模式原则之:接口隔离原则ISP
前言:有朋友问我,设计模式原则这些东西在园子里都讨论烂了,一搜一大把的资料,还花这么大力气去整这个干嘛.博主不得不承认,园子里确实很多这方面的文章,并且不乏出色的博文.博主的想法是,既然要完善知识体系 ...
- C#软件设计——小话设计模式原则之:开闭原则OCP
前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...
- 设计模式原则——依赖倒转&里氏代换原则
设计模式一共有六大原则: 单一原则.开放封闭原则.接口分离原则.里氏替换原则.最少知识原则.依赖倒置原则. 这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出. 依赖倒转原 ...
- Java设计模式(二)设计模式原则
学习Java设计模式之前,有必要先了解设计模式原则. 开闭原则 定义 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭 用抽象构建框架,用实现扩展细节 优点:提高软件系统的可复用性及可维护性 C ...
- C++技术问题总结-第12篇 设计模式原则
设计模式六大原则,參见http://www.uml.org.cn/sjms/201211023.asp. 1. 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类仅仅负责一项职责 ...
- DesignPatternPrinciple(设计模式原则)一
设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需 ...
- DesignPatternPrinciple(设计模式原则)二
设计模式六大原则(5):迪米特法则 定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之 ...
- 设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 2.使用场 ...
随机推荐
- nodejs安装及使用步骤详解
就一段小小的时间不用,就忘得差不多了,果然好记性不如乱笔头. 1.必须要安装node环境(建议装在C盘,这是一个系统盘)+安装mongoose数据库 +Robot 3T之于mongodb就相当于so ...
- 配置HEXO
软件介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. 使用版本和操作系统 官网最新版 Windo ...
- Storm概念学习系列之Storm与Hadoop的角色和组件比较
不多说,直接上干货! Storm与Hadoop的角色和组件比较 Storm 集群和 Hadoop 集群表面上看很类似.但是 Hadoop 上运行的是 MapReduce 作业,而在 Storm 上运行 ...
- PHP笔试题和面试题
1.不用新变量直接交换现有两个变量的值 (1)list($a,$b)=array($b,$a); (2)a=a+b,b=a-b,a=a-b 2.PHP数字金额转大小格式,同时说明思路 function ...
- Mysql 如何设置字段自动获取当前时间,附带添加字段和修改字段的例子
--添加CreateTime 设置默认时间 CURRENT_TIMESTAMP ALTER TABLE `table_name`ADD COLUMN `CreateTime` datetime N ...
- Redis中String类型的Value最大可以容纳数据长度
项目中使用redis存储,key-value方式,在Redis中字符串类型的Value最多可以容纳的数据长度是512M 官方信息: A String value can be at max 512 M ...
- Java并发包——线程同步和锁
Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...
- 去除pycharm的波浪线
PyCharm使用了较为严格的PEP8的检查规则,如果代码命名不规范,甚至多出的空格都会被波浪线标识出来,导致整个编辑器里铺满了波浪线,右边的滚动条也全是黄色或灰色的标记线,很是影响编辑.这里给大家分 ...
- CAD Import .NET支持AutoCAD DWG 2013
CADSoftTools发布了CAD Import .NET 9一个新版本.NET开发库,可以提供给开发人员导入AutoCAD DWG.DXF.HPGL.PLT.CGM等格式的功能. 在新版本中,CA ...
- iOS编程规范(整理)
一.文档结构管理 1.建立Libraries文件夹,所有第三方库放入其中. 2.建立Utilities文件夹,自已封装的类放入其中. 3.建立Constants.h头文件,所有的常量定义于其中.Con ...