什么是设计模式

设计模式(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# - 设计模式目录的更多相关文章

  1. 00-c#与设计模式目录

    工作5年多了,使用的语言是asp.net(c#),感觉自己遇到了技术瓶颈,以前一直忙着做兼职.接私活.加班,没有时间静下来好好想想自己的发展方向,就着春节期间放假,没事自己躺在老家的火炕上,问自己想要 ...

  2. Head First 设计模式目录

    这确实是本好书啊,看其他的书,都会有种看了就忘,看着看着就会有种昏昏欲睡的感脚,然而,这本书却能让我在看了之后记住自己看了些什么. 并且在本书的开头,作者也在一个劲的告诉你如何让自己来记住自己看了什么 ...

  3. GOF 23种设计模式目录

    经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...

  4. 读书笔记--Head First 设计模式 目录

    1.设计模式入门 2.观察者模式 3.装饰者模式 4.工厂模式 5.单件模式 6.命令模式 7.适配器模式与外观模式 8.模板方法模式 9.迭代器与组合模式 10.状态模式 11.代理模式 12.复合 ...

  5. 【设计模式】java设计模式目录

    1.创建型模式 JDK1.5枚举Singleton    单例模式 AbstractFactory  工厂方法模式    简单工厂模式 Builder Prototype 2.结构型 java设计模式 ...

  6. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Metho ...

  7. 小菜学习设计模式(四)—原型(Prototype)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  8. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  9. 小菜学习设计模式(二)—单例(Singleton)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

随机推荐

  1. 【原创】从Rest到Graphql

    引言 开局两张图,内容全靠编- ok,如图所示,我在去年曾经写过一篇文章<闲侃前后端分离的必要性>.嗯,我知道肯定很多人没看过.所以我做一个总结,其实啰里八嗦了一篇文章,就是想说一下现在的 ...

  2. Tree 和ls 的使用

    再次声明:linux下的文件系统采用树的结构实现的 我们 可以安装 Tree 软件 在当前目录下(随便一个当前目录下)输入 tree 命令,我们可以看到整个当前文件目录下的目录以及文件的树状结构,这也 ...

  3. Linux操作系统计划任务

    ++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的计划任务内容:计划任务分为单次任务和周期性任务,周期任务分为系统级计划任务和用 ...

  4. 深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(二)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com AlexNet在2012年ImageNet图像分类任务竞赛中获得冠军.网络结构如下图所示: 对CIFA ...

  5. 鼠标拖动DOM

    自己收藏,使用angualrjs的directive些的鼠标拖动DOM.... <!DOCTYPE html> <html lang="en"> <h ...

  6. idea 转载

    转载:https://blog.csdn.net/qq_34033853/article/details/77448431 摘要:在创建类时,自动生成代码的注释模板 本篇内容为大家提供的是Intell ...

  7. 使用jquery移除前面通过onclick绑定的元素的事件,然后重新绑定别的函数来执行onclick事件。

    http://caibaojian.com/css3/experience/bugs.htm 使用jquery移除前面通过onclick绑定的元素的事件,然后重新绑定别的函数来执行onclick事件. ...

  8. cv2.matchTemplate()函数的应用,匹配图片后画出矩形

    import cv2 as cv import numpy as np """ matchTemplate(): 参数image:待搜索的图像(大图) 参数temple: ...

  9. 使用apidoc生成项目文档

    [1]npm install apidoc -g 全局安装apidoc [2]apidoc -v 查看是否安装成功 [3]apidoc.json apidoc的项目级配置文件,它必须位于整个工程目录顶 ...

  10. Docker 入门篇

    Docker 简介 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 更快速的启动时间 一致的运行环境 持续交付和部署 更轻松的迁移 更轻松的维护和 ...