• 设计模式6大原则详解


    设计模式六大原则: 面向对象语言开发过程中,推荐的一些指导性原则(并不是强制要求的)

    1. 单一职责原则(Single Responsibility Principle)
    2. 里氏替换原则(Liskov Substitution Principle)
    3. 依赖倒置原则(Dependence Inversion Principle)
    4. 接口隔离原则(Interface Segregation Principle)
    5. 迪米特法则 (Law Of Demeter)
    6. 开闭原则(Open Closed Principle)


    1.单一职责原则(Single Responsibility Principle)

    1. 单一职责原则:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。

    简单来说单一职责原则就是:一个类只负责一件事儿,一个类不要让他太“累” ;

    优点:拆分之后,职责变得单一
              阅读简单,易于维护;
              扩展升级,减少修改,直接增加类;
              方便代码重用的;
              总的来说就是使程序:简单--稳定--强大

    缺点:单一职责的成本:类变多了;上端需要了解更多的类

    衡量着使用:如果类相对稳定,扩展变化少,而且逻辑简单,违背单一职责也没关系

                         代码足够简单,就可以稍稍违背;
                         如果不同的职责,总是一起变化,这种是一定要分开的;
     
    当然不只是类要支持单一职责原则,下面这些也要支持:

    方法:方法多个分支,还可能扩展变化,最好拆分成多个方法;
    类:接受输入-数据验证-逻辑计算--数据库操作--日志 为了重用,方便维护升级;
    接口:也会把不同的功能接口,独立开来;
    类库:把项目拆分成多个类库,重用--方便维护;
    项目:一个web解决所有问题:客户端;管理后台;定时服务;远程接口; 还是要拆分;
    系统:成熟互联网企业,有N多项目,有很多重复功能,IP库/日志库/监控系统/在线统计。。。;

    2. 里氏替换原则(Liskov Substitution Principle)

    里氏替换原则:任何使用基类的地方,都可以透明的使用其子类;也就是,继承+不改变行为;

    继承:通过继承,子类拥有父类的一切属性和行为,任何父类出现的地方,都可以用子类来代替;
    1 子类必须完全实现父类有的方法,如果子类没有父类的某项东西,就断掉继承;
    2 子类可以有父类没有的东西,所以子类的出现的地方,不一定能用父类来代替;
    3 透明,就是安全,父类的东西换成子类后不影响程序:
         a 父类已经实现的东西,子类不要去new;
         b 父类已经实现的东西,想改的话,就必须用virtual+override 避免埋雷;

      声明变量、参数、属性、字段,最好都是基于基类的,也就是里式替换原则,能在父类声明的东西不要在子类声明;

    3. 依赖倒置原则(Dependence Inversion Principle)

    依赖倒置原则:高层模块不应该依赖于低层模块,二者应该通过抽象依赖,也就是要依赖抽象,而不是依赖细节;

    抽象:抽象类/接口
    细节:具体的类

    23种设计模式,80%以上跟这个有关

    依赖细节:程序写死了,不谈什么扩展;
    依赖抽象,更具有通用性,而且具备扩展性;
    细节多变的,抽象是稳定的;系统架构基于抽象来搭建,会更稳定更具备扩展性

    面向抽象编程, 底层模块里面尽量都有抽象类/接口,
    在声明参数/变量/属性的时候,尽量的都是 接口/抽象类

    有人说:你说的我都懂,但是我在开发的过程中,好像没有感觉哪里需要抽象?
        其实是因为你的项目还不够麻烦,,如果项目不考虑扩展变化,那确实不需要依赖倒置

    4. 接口隔离原则(Interface Segregation Principle)

    接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上;
                           实现一个接口的时候,只需要自己必须的功能;

    为什么不建立一个大而全的接口,而是要拆分?

    因为不能让类型实现自己没有的功能;


    为什么要尽量的用同一个接口?

    尽量让抽象更具备复用性;

    接口拆分是随着项目进程而演变的,一直演变下去,是不是直接拆分成一个接口一个方法得了??
    如果真的一个接口一个方法,那也没意义了;

    究竟该如何设计呢? 确实需要丰富的经验和对业务的理解:
    1 接口不能太大,否则会实现不需要的功能;
    2 接口还是要尽量的小, 但是一致的功能是应该在一起的,密不可分的功能不要分开;
       不能过度设计 要考虑清楚业务的边界;
    3 接口合并:如果一个业务包含多个固定步骤,我们不应该把步骤都暴露,而是提供一个入口即可;如地图导航,里面有搜索-定位-导航接口,对于用户只要结果导航,所以要把三个接口合并;

    5. 迪米特法则 (Law Of Demeter)

    迪米特法则(最少知道原则):一个对象应该对其他对象保持最少的了解。

    面向对象--类--类与类之间会有交互--功能模块--系统
    高内聚,低耦合:高度封装,尽量少的暴露信息,类与类之间减少依赖;
    只与直接的朋友通信

    去掉内部依赖--降低访问修饰符
    门面(外观)模式/中介者模式

    6. 开闭原则(Open Closed Principle)

    开闭原则:对扩展开发,对修改关闭;
    如果有功能扩展变化的需求,希望是增加类而不是修改;
    修改会影响原有功能,引入错误;
    增加类就不会影响原有的东西;

    开闭原则是原则的原则,五大原则是手段,这个是目标;
    修改方法--增加方法(修改类)--增加类--增加dll--配置文件;

    当然项目设计的时候,其实很难说全部都满足;任何一个项目都有自己的特点;
    会在这里有所取舍;

  • 相关阅读:
    20080408 VS2003 中 Jscript 文件中文乱码问题
    20080330 single process memory on Windows and Windows virtual memory
    20080331 Corillian's product is a Component Container Name at least 3 component containers that ship now with the Windows Server Family
    20080330 the difference between an EXE and a DLL
    20080408 Javascript中的字符串替换replaceG
    20080501 修复Windows Update 自动更新
    20080331 How many processes can listen on a single TCPIP port
    20080329 What is a Windows Service and how does its lifecycle differ from a standard EXE
    20080407 Fire in the hole
    20080328 Adobe Launches Webbased Photoshop Express
  • 原文地址:https://www.cnblogs.com/sxw117886/p/13345757.html
Copyright © 2020-2023  润新知