zoukankan      html  css  js  c++  java
  • 面向对象设计原则

    面向对象设计原则

    1.面对对象设计原则共有7个:

            单一职责原则

              开闭原则

              里氏代换原则

              依赖倒转原则

              接口隔离原则

              合成复用原则

              迪米特法则

      学习过程是这样子的:要求掌握每一个原则的中英文名,缩写。中英文定义,并掌握一个实例

    2.这些原则的目标是   实现软件的可复用性和可维护性(扩展和修改)

    3.单一职责原则(Single Responsibility Principle,SRP

         定义:在软件系统中,一个类只负责一个功能领域中的相应职责。

                  There should never be more than one reason for a class to change.

                    或   就一个类而言,只能有一个引起它变化的原因。

                  ·单一职责原则是实现高内聚,低耦合的指导方针。

         实例:   设计模式学习2

          在Login类中,init()初始化界面,display() 显示界面,valicate() 验证登陆名和密码,getConnectiong()获取数据库连接,……..在这个类中有至少四个引起它变化的原因,那么如何根据单一职责原则进行重构呢~~~ 设计模式学习2

    4.开闭原则(Open-Close Principle,OCP)

    定义: 一个软件实体,对修改是关闭的,对扩展是开放的。

          Software entities should be open for extension,but closed for modification.

          抽象化是开闭原则的关键。

     实例:

     设计模式学习2

     
     

    设计模式学习2

           想要改变Button,如果像上面这样写,就要修改源代码,违背了开闭原则。

          所以我们进行重构:设计模式学习2

    提取一个抽象层,然后在配置文件中指定使用的是哪一个子类。

    5.里氏代换原则(Liskov Substitution Principle,LSP)

    定义:  出现父类的地方可以用子类的对象代替,而不会产生异常。

            Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

       在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

    6.依赖倒转原则(Dependence Inversion Principle,DIP)

    定义:要针对接口编程,不要针对实现编程

    Program to an interface,not an implementation.

    开闭原则是面向对象设计的目标,里氏代换原则是实现开闭原则的基础,依赖倒转原则是主要手段。

    7.接口隔离原则(Interface Segregation Principle,ISP)

    定义: 一旦一个接口太大,则需要把它分割成一些更细小的接口,使用该接口的客户端仅

    需知道与之相关的方法即可。

    使用多个专门的接口,而不使用单一的总结口。每一个接口应该承担一种相对独立的角色。

    可以在进行系统设计的时候采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,隐藏用户不需要的行为。

    实例:设计模式学习2

    重构之后:

    设计模式学习2

    8.合成复用原则。很重要!!!(Composite Reuse Principle,CRP)

    定义:尽量使用对象组合,而不使用继承来达到复用的目的。

    Favor composition of objects over inheritance as a reuse mechanism.

    扩展的时候用继承,复用的时候用关联。

    继承复用的缺点:

    1.     破坏封装性。不管想用的不想用的方法全部都继承了。无法实现选择性继承。

    2.     如果想要更换父类,必须修改源代码,违背了开闭原则。

    那么,关联复用是怎么实现更换父类的呢

    设计模式学习2

    B类一开始关联了A类,使用A类的m()方法,后来觉得A1类的m()方法更好,为了遵守开闭原则,使用一个A1Adapt类继承A类,然后在A1Adapt类中重写m()方法,再重写时使用A1类的m()方法。这也就是适配器模式。

    3.     只能在有限的条件下使用,比如说,如果A1类是final类呢?。。。

    8.迪米特法则(Law of Demeter)

    为了降低系统的耦合度,可以适量增加中介者类。

  • 相关阅读:
    libevent简介[翻译]3 前言
    libevent简介[翻译]2 关于异步IO的简单介绍
    gdb调试子进程
    openSUSE Firewalld
    libevent简介[翻译]1 关于这个文档
    构建libevent pdf 文档
    openSUSE编译libevent
    为openSUSE添加源
    .Net Core3.0 WebApi 项目框架搭建 五:仓储模式
    .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证
  • 原文地址:https://www.cnblogs.com/zqlmmd/p/5460138.html
Copyright © 2011-2022 走看看