设计模式 - 七大设计原则(四)- 合成复用原则与设计原则总结

概述

简单介绍一下七大设计原则:

  1. 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭
  2. 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体
  3. 单一职责原则:一个接口只负责一件事情,只能有一个原因导致类变化
  4. 接口隔离原则:使用多个专门的接口,而不是使用一个总接口
  5. 迪米特法则(最少知道原则):只和朋友交流(成员变量、方法输入输出参数),不和陌生人说话,控制好访问修饰符
  6. 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能
  7. 合成复用原则:尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的

合成复用原则

定义

合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组 合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的。可以使系统更加灵 活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。

继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱 复用,对类以外的对象是无法获取到实现细节的。要根据具体的业务场景来做代码设计, 其实也都需要遵循 OOP 模型。

示例

还是以数据库操作为例,先来创建 DBConnection 类:

/**
 * @author eamon.zhang
 * @date 2019-09-26 上午10:42
 */
public class DBConnection {
    public String getConnection() {
        return "MySQL 数据库连接";
    }
}

创建 ProductDao 类:

/**
 * @author eamon.zhang
 * @date 2019-09-26 上午10:43
 */
public class ProductDao {
    private DBConnection dbConnection;

    public void setDbConnection(DBConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    public void addProduct() {
        String conn = dbConnection.getConnection();
        System.out.println("使用" + conn + "增加产品");
    }
}

这就是一种非常典型的合成复用原则应用场景。但是,目前的设计来说,DBConnection 还不是一种抽象,不便于系统扩展。目前的系统支持 MySQL 数据库连接,假设业务发生 变化,数据库操作层要支持 Oracle 数据库。当然,我们可以在 DBConnection 中增加对 Oracle 数据库支持的方法。但是违背了开闭原则。其实,我们可以不必修改 Dao 的代码, 将 DBConnection 修改为 abstract,来看代码:

/**
 * @author eamon.zhang
 * @date 2019-09-26 上午10:42
 */
public abstract class DBConnection {
    public abstract String getConnection();
}

然后,将 MySQL 的逻辑抽离:

/**
 * @author eamon.zhang
 * @date 2019-09-26 上午10:46
 */
public class MySQLConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "MySQL 数据库连接";
    }
}

再创建 Oracle 支持的逻辑:

/**
 * @author eamon.zhang
 * @date 2019-09-26 上午10:47
 */
public class OracleConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Oracle 数据库连接";
    }
}

具体选择交给应用层,来看一下类图:


设计原则总结

学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都 遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的 场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。

(0)

相关推荐

  • 设计模式 - 七大设计原则(三)- 迪米特法则与里氏替换原则

    概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个接口只负责一件事情,只能有一个原因 ...

  • Java设计模式-软件设计原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 1 开闭原则 对扩展开放,对修改 ...

  • 设计模式-七大软件设计原则

    设计模式 参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好的设计模式 http://c.biancheng.net/view/1326.html 基本原则 开闭原则 在设计的 ...

  • 写好 Python 代码的5条重要技巧

    来源:NightTeam-韦世东 程序设计的好与坏,早在我们青葱岁月时就接触过了,只是那是并不知道这竟如此重要.能够立即改善程序设计.写出"好"代码的知识有以下几点: ·面向对象五 ...

  • 【资料】23种设计模式和六大设计原则

    程序IT圈 www.cxyquan.com 优秀的程序猿技术公众号 1 设计模式的六大原则 ☛开闭原则 对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简 ...

  • 软件设计原则讲解,昭昭在目

    一.UML 图 不要觉得奇怪为什么不讲软件设计原则而说到了 UML 图,因为软件设计原则和软件设计模式中你讲到最多的便是利用类图来表示 类与类之间的关系,因此我们需要 先会看,再会理,最后再来写! 1 ...

  • 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能

    回复"000"获取大量电子书 写在前面 我们继续学习架构师技能,今天是本系列的第二篇,希望大家持续关注. 可能你不是科班出生,甚至大学都没念,没背景没关系.我们只要每天进步一点点, ...

  • ADAS算法设计(四):LDP算法设计

    根据GB/T标准<乘用车车道保持辅助(LKA)系统性能要求及试验方法>报批稿定义,车道保持辅助系统LKA应至少具备车道偏离抑制LDP或车道居中控制LCC中的一项. 目前市场上量产的LKA大 ...

  • 图解Java设计模式之设计模式七大原则

    图解Java设计模式之设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 单一职责原则 2.3.1 基本介绍 2.3.2 应用实例 2.4 接口隔离原则(Interface S ...

  • 掌握书房装修七大原则,轻松搞定书房设计!

    书房对于我们来说是个非常好的工作.学习.休闲之地,甚至还能帮我们收纳不少东西,可以说是一个集颜值与实用于一体的多功能空间. 说到书房装修,感觉好像平平无奇没有什么特别之处,因为它不像厨卫装修涉及到防水 ...

  • 我在架构设计和代码开发中的一些常用原则

    不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己应该怎么做.我一生中学到的最重要的东西是一种以原则为基础的生活方式,是它帮助我发现真相是什么,并据此如何行动. ...

  • 成果导向实施的原则、特点、构架、设计、应用及与传统教学的对比

    编者按:师范类专业认证坚持"学生中心.产出导向.持续改进"OBE理念,是师范类专业认证工作的行动指南,贯穿师范类专业认证全过程.学生中心强调从以"教"为中心的传 ...

  • PPT版式设计第25期: PPT页面就近原则设计

    PPT版式设计第25期: PPT页面就近原则设计 在平面设计中一个非常经典设计原则,叫做就近原则.那什么是就近原则呢?简单的理解就是当不规则的形状图形放在一起的时候,从视觉上会觉得他们是一个整体.下图 ...

  • 四柱八字看财富的原则,看你命中是否大富大贵

    从八字命局看一个人能不能有钱,与身旺衰无关,与工作努力大小也不成比例. 看能不能拥有钱财,主要是六个原则: 一,代表天地正气的月令对命主起好作用. 二,财星起好作用流通到日主. 三,日元合财或财合日元 ...