zoukankan      html  css  js  c++  java
  • 常用设计原则(精华篇)

    作者:haibiscuit

    时间:2019:3:6

    您的star是我不断前行的动力

    https://github.com/haibiscuit

    转载请说明出处

    前言:
    面向对象设计的目标在于支持可维护性复用:
    一方面需要实现设计方案和源代码的复用,
    另一方面要确保系统易于扩展和修改,具有良好的可维护性。
    一:经常用到的设计原则
    使用频率
    单一职责原则 ****
    开闭原则 *****
    里氏代换原则 *****
    依赖倒转原则 *****
    接口隔离原则 **
    合成复用原则 ***

    一:单一职责原则(用于控制类的粒度大小)
    定义:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。

    例如:图表统计模块
    CustomerDataChart类 (封装了如下的行为)
    GetConnection():Connection //用于连接数据库
    FindCustomers():List //用于查询所有的客户信息
    CreateChart():void //用于创建图表
    DisplayChart():void //用于显示图表

    以上的问题:
    CustomerDataChart类承担了太多的职责
    1.既包含与数据库相关的方法
    2.又包含与图表显示相关的方法
    解决问题:
    将CustomerDataChart类拆分成三个类
    1.DBUtil:负责连接数据库,包含数据库连接方法,GetConnetcion().
    2.CustomerDao:负责操作数据库中的Customer表,包含对Customer表的增删改查,例如FindCustomers().
    3.CustomerDataChart:负责图表的生成和显示,包含方法CreateChart()和DisplayChart().

    二:开闭原则(需要做到不修改原来代码的基础上扩展系统的功能)
    定义:软件实体对扩展开放,对修改关闭。

    重点:
    1.为了满足开闭原则,需要对系统进行抽象化的设计,抽象化是开闭原则的
    关键。
    2.可以为系统定义一个相对稳定的抽象层,而将不同的额实现行为移至具体 的实现层中完成。
    3.可以通过接口、抽象类等机制来定义系统的抽象
    4.如果想修改系统的行为,无须对系统的抽象层进行任何的修改,只需要增加
    新的具体类来实现新的业务,实现再不修改已有的代码的基础上扩展系统的功能。

    三:里氏代换原则(即运行时基类调用子类实现的方法)
    定义:所有引用基类的地方必须能透明地使用其子类的对象

    重点:
    1.应该将父类设计成抽象类或接口,让子类继承父类或实现父类接口,并实现父类中声明的方法。运行时,子类实例替换父类实例,可以很方便的扩展系统的功能,无须修改原有子类的代码,增加新的功能可以通过增加新的子类来实现。

    四:依赖倒转原则(要针对接口编程,不要针对实现编程)
    定义:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细
    节,细节应该依赖于抽象。

    重点:
    1.使用接口和抽象类进行变量类型声明,参数类型声明,方法返回类型声明 ,以及数据类型的转换等,而不要用具体类来做这些事情。
    2.在实现依赖倒转原则时,需要针对抽象层进行编程,而将具体类的对象通 过依赖注入的方式注入到其他对象中。
    3.依赖注入是指,一个对象要与其他对象发生依赖时,通过方法参数来注入 所依赖的对象。常用的方法有三种(构造注入,设值注入和接口注入)。
    4.这些方法在定义时使用的抽象类型,在运行时再传入具体的对象,由子类
    对象来覆盖父类对象。

    五:接口隔离原则
    定义:客户端不应该依赖那些它不需要的接口

    重点:
    1.根据接口隔离原则,当一个接口太大时,需要将它分割成一些更细小的接 口,使用该接口的客户端需要知道与之相关的接口即可。

    六:合成复用原则(要尽量使用组合/聚合关系,少用继承)
    定义:优先使用对象组合,而不是继承来达到复用的目的。

    重点:
    1.一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用的目的。

    例如:
    在设计数据库连接操作的时候可以基于以下设计。
    组件为CustomerDao、DBUtil、OracleDBUtil、MysqlDBUtil
    组件介绍:
    1.CustomerDao:依赖DBUtil类,用于数据库的操作
    2.DBUtil:可以是抽象类,或接口,或具体类,用于获取不同数据库连接
    3.OracleDBUtil:实现或继承DBUtil类,用于获取Oracle数据库的连接。
    4.MysqlDBUtil:实现或继承DBUtil类,用于获取Mysql数据库的连接。

    这样,如果需要其他数据库的连接操作,只需要继承或实现DBUtil类即可,达到了可扩展性。

    总结:
    1.依赖注入可通过构造注入,设值注入和接口注入实现
    2.设计模式无非是为了考虑设计的可扩展性和可维护性,
    主要需要考虑到可变的部分,
    例如在不需要修改原有代码的情况下,通过继承、实现等方式来增加新的功能,达到可扩展性,
    例如通过组件(类或行为)的单一职责,达到组件的可维护性
    例如通过合成复用原则,达到组件的复用,提高系统的灵活性
    ...

    设计模式的思想:
    1.多用接口和抽象编程
    2.单一职责
    3.多用组合/聚合,少用继承
    4.功能拆分

  • 相关阅读:
    php配置COM组件正常运行
    调试python程序
    git 较基础命令
    学习一下参数初始化
    谈谈pooling?
    Caffe 源碼閱讀(六) InternalThread
    Caffe 源碼閱讀(六) data_layer.cpp
    Caffe 源碼閱讀(五) Solver.cpp
    Caffe.proto使用
    Caffe 源碼閱讀(四) Layer.hpp Layer.cpp
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10484578.html
Copyright © 2011-2022 走看看