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.使用场 ...
随机推荐
- QPS,TPS,吞吐量,响应时间详解及关系
并发数 并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力 吞吐量吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标 响应时间RT(Respo ...
- java 集合解析
Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的? 比如说:ArrayList 和 Vector 是用数组的方式存储的Set里的 hashSet 和TreeSet是用什么方式存储的?怎么 ...
- angularJs1.x 版本中 uib-tabset 如何默认激活不同的标签页
<uib-tabset> 默认有个active属性,根据官方文档,active的默认值是0,也就是说,默认显示索引为0的标签页,可以通过修改这个值来默认显示不同的索引的标签页. 示例: ...
- NetworkUtils
import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Lo ...
- java——方法重载与重写、构造方法、this关键字、static关键字、strictfp关键字、类的导入
Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用.当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错 ...
- Linux Shell命令系列(4)
16. cat命令 “cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容. 17. cp 命令 “copy”就是复制.它会从一个地方复制一个文件 ...
- C#中接口的深入浅出【转】
C#中接口的深入浅出 假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示:Delphi程序员指的是用Delphi写程序的程序员,用clsDelp ...
- ElasticSearch安装(以Docker的方式)
拉取docker镜像: docker pull docker.elastic.co/elasticsearch/elasticsearch:6.1.1 命令行方式启动 测试环境 :docker ...
- mui的ajax例子2
mui.post()方法 前端页面: <!DOCTYPE html><html><head> <meta charset="utf-8"& ...
- JAVA继承与使用
说来惭愧,java学完已经两年了,开发也已经做了快一年了,现在才基本了解继承怎么用,平时都是在一个类中乱写一气.现在感觉原来学的知识真正运用起来还是具有一定的差距.希望能够先夯实基础,共勉.写一下自己 ...