C# - 设计模式目录
什么是设计模式
设计模式(OOD)是在面向对象编程(Object Oriented Programming,OOP)中针对在以往的编程里出现的问题所提出的一种解决思路、一种设计类型时的思想和经验,对未来可能出现的变化提前设计出具有弹性、易维护、易扩展、易伸缩的类型结构。设计类的结构时一定要保证未来需求改变时,只做最小修动就可以适应新的变化。也即,在保证满足需求的同时,应多思考如何保证系统的灵活性。
设计模式原则
1.找到合适的对象
从一份需求文档的描述中,找到名词和动词,名词对应类型或属性,动词对应方法,抽取出文字中的关键字,然后按照对象的层次结构封装到类型中。
2.组合引用
子类可以隐式转换为父类,这会导致两个问题,其一是:子类维护了父类上下文,它内部可以操纵父类成员并修改它们,一旦子类修改了父类的成员,那么外部调用子类隐式转换为父类的实例时,结果可能就不符合预期。其二是:基类将某个成员修饰为私有,那么外部调用子类隐式转换为父类的实例时,结果可能就不符合预期。而使用组合对象,也即将一个类型作为资深的字段或属性存取,就可以避免这种情况的发生。参看:隐式转换的问题
3.里氏替换
父类中被修饰为virtual的方法允许子类重写,为了满足开闭原则,子类的实现必须与父类的虚方法是同样的逻辑,但如果virtual方法是操纵父类的其它成员,那么其它成员必须是public或protected的,决不能是private。如果是private,那么子类是无法实现重写的,因为它不能在重写虚方法的内部访问父类的private成员。
4.高内聚
是指类型应职责单一,职责是指具有代码块的成员,代码块成员提供的实现应该是单一功能的实现,单一功能的实现可以被利用来达到最大化复用的目的。假如一个方法执行了简单计算,然后又将结果指向了查询,再执行提交动作,甚至可能还有一大堆的操作,那么该方法的复用性会变得很低。而假如它只提供单一的实现,只返回计算结果,由另一个方法来执行查询,再另一个方法去执行提交动作,那么这几个方法的复用性就会很高。
5.低耦合
解耦时指,让类不再依赖于具体的类型,而应该依赖于抽象,抽象就像一个角色,我不需要你,我只需要一个和你是同一种角色的任何对象。
6.分离关注点(封装)
关注点指面向对象编程中的一切事物,关注点是被外部调用的事物。分离是指利用封装将外部调用的关注点(目标)用另一个对象替代,而这个对象具有代码块。这样做的好处自然是容易应付未来可能发生的修改,比如将字段封装为属性,外部只能调用属性,今后字段应需求被移除,但属性还可以继续提供另一个返回值,我们修改属性的返回值却并不会影响外部的调用。也即,外部调用还是依旧保持不变。一切的类型设计都是为了预防未来需求改变时,尽最大努力使外部的调用不做一丝一毫的修改,我们只需要改动一处就可以让程序适应新的变化。
7.分离接口
接口不应具有太多的方法,应将多方法分散到不同的接口中。
8.提取重复
应将在所有子类中完全重复的代码抽取出来,放到基类中
9.提取变化
将未来可能面对变化的行为封装起来,用依赖关系来调用这些行为。
10.对修改关闭,对扩展开放
对修改关闭,是指一旦对类型的设计完成,今后就要尽量保证不会因为需求的变化对类型进行修改,因为修改已经设计好的类型就会面临可能的巨大风险,会导致原来的代码不能正确的执行。对扩展开放是指类型不依赖于其它具体的类型,而是依赖于抽象类或接口,这样,需求变更时只需要修改抽象的实现或接口的实现,所以,无论需求如何变更都不会修改已经设计好的类型内部的结构。
11.依赖抽象,不要依赖具象
抽象类似于角色,类型结构设计应考虑将对具体类型的引用更改为对角色的引用
12.从抽象派生
任何类型都应尽量从抽象派生
13.不要覆盖抽象类的成员
子类将抽象类当做模板使用,不要试图用new操作符覆盖抽象的成员,因为抽象是其它类型所依赖的事物,它等待具体子类为其提供实现而不是覆盖,覆盖的成员属于子类的成员,这样的成员就与抽象超类失去的关系,外部调用抽象时可能会抛出异常。
14.从底层开始设计
类型结构的设计应着眼于底层子类,从子类开始设计,提取重复的实现到超类,一步一步自下而上地设计类型。
15.依赖倒置
依赖倒置是相对于依赖倒置之前的类型结构的设计,在设计中,a类型依赖于b类型,b类型是具体的类型而非角色类型,所以b类型可能会在a类型中到处都留有引用,假设在a类型中有100处对b类型的引用,那么如果今后需求改动,比如b类型可能做出修改时,就会牵动引用了b类型的a类型结构的异常,此时你得修改100处对b类型的引用。而依赖倒置中倒置的意思正在于,a类型只依赖于角色,角色可以是b,c,d类型的抽象类型或接口,而b、c、d总是从角色派生。这样,角色就处于a与b、c、d类型的中间地带,没有倒置前是a依赖于b,倒置后则是a依赖于抽象,而b从抽象派生,抽象是b的超类,倒置了依赖关系(之前依赖子类,之后依赖子类的超类),此为倒置。
设计模式目录
设计模式中经常使用接口一词,接口泛指一切可以提供数据操作逻辑的代码块对象。下面只介绍几种我觉得比较容易理解的模式,但并不全面,比如像什么组合模式、享元模式、桥接模式,我都懒得写出来,因为这些东东都是一些思维定势,学习设计模式不是要死记硬背,而是悟透其根本的价值观念,只要明确了以上的设计原则之后,完全自己可以举一反三,面对未来的改变去思考如何做出更为优雅的类型结构设计就可以了。
1.单例模式
2.模板模式
3.钩子模式
4.建造者模式
2.外观模式
3.适配器模式
4.命令模式
5.策略模式
6.观察者模式
7.装饰者模式
8.抽象工厂模式
C# - 设计模式目录的更多相关文章
- 00-c#与设计模式目录
工作5年多了,使用的语言是asp.net(c#),感觉自己遇到了技术瓶颈,以前一直忙着做兼职.接私活.加班,没有时间静下来好好想想自己的发展方向,就着春节期间放假,没事自己躺在老家的火炕上,问自己想要 ...
- Head First 设计模式目录
这确实是本好书啊,看其他的书,都会有种看了就忘,看着看着就会有种昏昏欲睡的感脚,然而,这本书却能让我在看了之后记住自己看了些什么. 并且在本书的开头,作者也在一个劲的告诉你如何让自己来记住自己看了什么 ...
- GOF 23种设计模式目录
经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...
- 读书笔记--Head First 设计模式 目录
1.设计模式入门 2.观察者模式 3.装饰者模式 4.工厂模式 5.单件模式 6.命令模式 7.适配器模式与外观模式 8.模板方法模式 9.迭代器与组合模式 10.状态模式 11.代理模式 12.复合 ...
- 【设计模式】java设计模式目录
1.创建型模式 JDK1.5枚举Singleton 单例模式 AbstractFactory 工厂方法模式 简单工厂模式 Builder Prototype 2.结构型 java设计模式 ...
- 小菜学习设计模式(五)—控制反转(Ioc)
写在前面 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Metho ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- 小菜学习设计模式(二)—单例(Singleton)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
随机推荐
- 分享收集的WebGL 3D学习资源
大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...
- openstack第一章:keystone
第一篇keystone— 身份认证服务 一.Keystone介绍: keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身 ...
- 类System
System类简介: 在 System 类中提供了大量的静态方法,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载文件和库的方法:还有快速复制数组的一部分的实用方法. 常用方法 ...
- Markdown语法基础
Markdown基本语法 创建 2018-09-07 by YANHAI 标题:Setext方式 三个或更多 大标题 === 小标题 --- 大标题 小标题 标题:Atx方式 # 内容 (一级标题) ...
- [转帖]优化IMPDP/EXPDP导入导出速度
优化IMPDP/EXPDP导入导出速度 https://www.2cto.com/database/201308/238176.html 一年半没太学习数据库了.. 其实这个parallel 的参数一 ...
- CentOS_7下安装PHP7.3
安装mysql:https://www.cnblogs.com/jiangml/p/10402390.html 下载PHP安装包: 官网:http://www.php.net/downloads.ph ...
- mysql join用法简介
为什么需要join 为什么需要join?join中文意思为连接,连接意味着关联即将一个表和多个表之间关联起来.在处理数据库表的时候,我们经常会发现,需要从多个表中获取信息,将多个表的多个字段数据组装起 ...
- C# call webservice方法
https://www.cnblogs.com/Fooo/p/5507153.html
- settings 配置 + 测试环境搭建
若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', ...
- Vue-route实现原理
1.原理图如下所示 2.说明 1.安装插件的时候监听hashchange事件,监视_route 2.处理router-link 获取到path关联组件 3.等待hashchange触发,匹配route ...