什么是设计模式

设计模式(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. vue 绑定样式的几种方式

    vue 绑定样式 对象语法 1.v-bind:class设置一个对象,动态切换class <div :class="{'active':isActive}">xxx&l ...

  2. C# WinForm 技巧十: winfrom 全屏自适应屏幕分辨率

    Rectangle rect = new Rectangle(); rect = Screen.GetWorkingArea(this); this.Width = rect.Width;//屏幕宽 ...

  3. JAVA如何利用Swiger获取Linux系统电脑配置相关信息

    最近开发java应用程序,涉及到获取Linux服务器相关配置的问题,特地网上搜寻了下,采用Swiger包可以直接获取,再次小结一下,以便于以后能方便使用,也便于其他童鞋们学习. 推荐大家参考链接:ht ...

  4. 【问题解决方案】ImportError: No module named 'pygal'

    <Python编程:从入门到实践>一书,第二个项目-可视化,第四节用到pygal 安装部分用 'python -m pip install pygal==1.7' 安装,但使用时仍然报错 ...

  5. jsonp 实现前端跨域

    1.基于ajax 发起jsonp 请求. 前端代码: let url = 'http://localhost:8001/'; $.ajax({ type: 'get', dataType: 'json ...

  6. DAY30、网络编程

    一.网络编程 软件开发 c/s架构 c:客户端 s:服务端 b/s架构 b:浏览器 s:服务端 本质:b/s其实也是c/s 服务端:24小时不间断提供服务,谁来救服务谁 客户端:想什么时候体验服务,就 ...

  7. CTFcracktools——非常实用的CTF解密工具

    做bugku的crypto题时偶然发现了这个,吐血推荐!! 十分全面好用 整合了常见的解码.进制转换等CTF常用的工具: 下载地址: https://github.com/0Linchen/CTFCr ...

  8. CentOS7安装MySQL8.0图文教程

    1.下载 MySQL 所需要的安装包 网址:https://dev.mysql.com/downloads/mysql/ 2.Select Operating System: 选择 Red Hat , ...

  9. Word技巧设置

    1.如何在Word中快速输入上下标 下标~~同时按住:Ctrl 和 =键: 上标~~同时按住:Ctrl 和 Shift 和 +键: 2.如何删除Word中产生的空白页 设置 段落 中的   固定值  ...

  10. request+response+jsp+el+jstl

    response: 1.设置响应行的状态码: response.setStatus(int sc); 2.设置response缓冲区的编码:response.setCharacterEncoding( ...