zoukankan      html  css  js  c++  java
  • 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.抽象工厂模式 
  • 相关阅读:
    Sql 行转换列(列转换行), JavaScript解决思路
    c# 异步线程
    C# 读取数据库存储过程返回值 笔记
    利用UtilityLibrary.dll WeifenLuo.WinFormsUI.Docking.dll控件创建工具栏效果
    关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
    通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷
    ubuntu下安装redis
    ubuntu下安装beanstalkd
    preg_match_all 执行一个全局正则表达式匹配
    mongodb的安装和进入
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/8588457.html
Copyright © 2011-2022 走看看