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.使用场 ...
随机推荐
- 不要忽视Web编程中的小细节
概述:长时间以来,我们创造了某些在构造和范围内用以提升网站易用性的约定和实践.然后在我们进行web编程的时候总有一些疏忽和纰漏.这里总结了一些web编程时容易出现的小错误,并给出了相应的补救方法,希望 ...
- 操作iframe的一些方法
//父页面操作iframe里的内容 oInput.onclick=function(){ var oBox = oIframe.contentWindow.document.getElementByI ...
- 定时备份mysql数据库
第一步:编写mysqldump备份数据库脚本,先新建txt文档,编辑内容为 @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" ...
- 01-----jQuery介绍
安装node.js cmd查看 node -v npm -v npm init --yes 初始化 npm install jquery --save 1.为什么要使用jQuery ...
- 【ACM】吝啬的国度 - DFS (图)
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...
- 自动生成actionbar 所需图片和style
http://jgilfelt.github.io/android-actionbarstylegenerator/
- Python 为threading.Thread添加 terminate
import threading import inspect import ctypes def _async_raise(tid, exc_type): """rai ...
- case 范围取值
你可以在单个case标签中指定一系列连续的值,就像这样: case low ... high: 这和单独的case标签的合适数字有同样的效果,每个对应包含在从low到high中的一个整数值. 这个 ...
- Oracle 搭建Node.js开发环境
先决条件 安装oralce客户端驱动. 安装node.js. 创建项目 安装oracledb模块 $npm install oracledb 如果失败了,你可能要爬墙. 参考package ...
- Quartz 定时器,同时运用多个定时器
效果:每天执行两个定时器,两个定时器不相关联.jar版本Quartz 2.2.3 Java工程结构图 jar 包下载: 链接: https://pan.baidu.com/s/1-7dh620k9P ...