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) ...
随机推荐
- In action "Setting JDBC driver jar location unix [Set a variable]" (screen "Select a Database [Configurable banner form]"), property "Script":
java.lang.Exception: JDBC Driver Jar not found. Looking for: /u01/oracle/GG_Director/ERROR: Unresolv ...
- 【故障公告】推荐系统中转站撑爆服务器 TCP 连接引发的故障
上周五下午,我们在博客中部署了推荐系统,在博文下方显示“最新IT新闻”的地方显示自动推荐的关联博文.我们用的推荐系统是第四范式的推荐服务,我们自己只是搭建了一个推荐系统中转站(基于 ASP.NET C ...
- 【学习总结】GirlsInAI ML-diary day-19-面向对象编程
[学习总结]GirlsInAI ML-diary 总 原博github链接-day19 认识面向对象 Python使用类(class)和对象(object),进行面向对象(object-oriente ...
- [蓝桥杯]2017蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 (分值:5) 题目:购物单 小明刚刚找到工作,老板人很好 ...
- vagrant三网详解(团队/个人开发必看) 转
vagrant三网详解(团队/个人开发必看) Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点. 一.端口映射(Forwarded port) 顾名思义是指把宿主计算机 ...
- Python视频人脸检测识别
案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现: 动图有点花,讲究着看吧: 如果是捕捉摄像头,只需要改变以下代码即可: c ...
- js 实现数据结构 -- 集合
原文: 在Javascript 中学习数据结构与算法. 概念: 即数学中的集合,在计算机科学中被应用成数据结构. 当然,集合中的数据具有不重复的特性.js 集合的原理大致上是 Object 的键值对 ...
- elastic的gc相关
https://www.jianshu.com/p/1f450826f62e gc原理介绍 相关优化 https://zhaoyanblog.com/archives/319.html 问题 ht ...
- 自动化测试框架【linux版】:JMeter + Ant + Jenkins
前提条件:linux安装了jmeter.ant.jenkins 安装方法参考汇总目录中对应的博文 截图看不清的,可以调大浏览器倍数看 jenkins驱动ant执行,ant驱动jmeter执行 ant调 ...
- css:a:visited限制
:active 对于:active伪类可以在div上生效.没有限制 :visited使用限制 :visited只适用于带href的a标签.如果给a标签绑定了click事件,那跳转的url必须跟href ...