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.使用场 ...
随机推荐
- javascript的模块发展
谨以此文记录了解js模块的过程 随着ES6的出现,js模块已经成为正式的标准了.曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD).SeaJs(CMD).Node(Common ...
- POJ1024 Tester Program
题目来源:http://poj.org/problem?id=1024 题目大意: 有一个迷宫,迷宫的起点在(0,0)处.给定一条路径,和该迷宫墙的设置,要求验证该路径是否为唯一的最短路径,该种墙的设 ...
- BZOJ4552(二分+线段树)
要点 序列是n个不同的数,则新学到的一种策略就是二分这个位置的答案,然后可以上下调. 神奇地只关注大于还是小于mid并赋值0.1,这样m个操作的排序就能用线段树维护了! #include <cs ...
- springBoot实现socketio
https://github.com/mrniko/netty-socketio-demo https://github.com/mrniko/netty-socketio
- 【ACM】棋盘覆盖 - 大数除
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- python入门之socket代码练习
Part.1 简单的socket单次数据传输 服务端: #服务器端 import socket server = socket.socket() # 声明socket类型,同时生成socket连接对象 ...
- Storm概念学习系列之storm简介
不多说,直接上干货! storm简介 Storm 是 Twitter 开源的.分布式的.容错的实时计算系统,遵循 Eclipse Public License1.0. Storm 通过简单的 API ...
- stdafx.h预编译头
转自http://blog.csdn.net/qingkong8832/article/details/6695123 stdafx.h 1名称的英文全称为:Standard Application ...
- 前端-页面性能调试:Hiper
前端-页面性能调试:Hiper 我们写单页面应用,想看页面修改后性能变更其实挺繁琐的.有时想知道是「正优化」还是「负优化」只能靠手动刷新查看network.而Hiper很好解决了这一痛点(其实Hi ...
- 检查python以及django是否安装配置成功
首先说明下,我使用pycharm作为开发的IDE,在第一次创建django项目的时候,会自动安装django包的.(网上也有很多单独安装的方法),环境变量配置成功后,就是用下面的方法检测安装成功与否. ...