【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )

一、合成复用原则简介

合成复用原则 又称为 组合复用原则 , 合成/聚合复用原则 , 组合/聚合复用原则 ;

合成复用原则定义 : 想要达到 软件复用 的目的 , 尽量使用 对象 组合/聚合 , 而不是 继承关系 ;

聚合 是 has-A 关系 ; ( 关系较弱 ) 代表部分事物的对象 ( 次 ) 与 代表聚合事物的对象 ( 主 ) 生命周期无关 , 删除了聚合对象 , 不代表删除了代表部分事物的对象 ;

组合 是 contains-A 关系 ; ( 关系较强 ) 一旦删除 代表组合事物的对象 ( 主 ) , 那么 代表部分事物的对象 ( 次 ) 也一起被删除 ;

继承 是 is-A 关系 ;

电脑 与 U 盘 是聚合关系 , 电脑没了 , U 盘可以独立存在 , 还可以接在其它电脑上 ;

A 类中包含了 B 类的引用 , 当 A 类对象销毁时 , B 类引用所指向的对象也一同消失 , 没有任何一个引用指向他 , 该引用成为了垃圾对象 , 被回收 ; 这种情况就是 组合 ;

加入 A 类销毁后 , B 类对象还有在其它位置被引用 , B 类对象不会被销毁 , 此时这种关系就是 聚合 ;


二、合成复用 与 继承复用 优缺点


合成复用优点 : 使系统 更加灵活 , 降低 类与类 之间的耦合度 , 一个类的变化对其他类造成的影响相对较少 ;

合成复用缺点 : 通过 组合 / 聚合 方式建造的系统 , 有较多的对象需要管理 ;

继承复用优点 : 扩展性容易实现 , 继承父类后 , 父类的所有功能都可以通过继承关系进入子类 , 修改和扩展都比较容易 ;

继承复用缺点 : 破坏包装 , 继承将父类的实现细节暴露给了子类 , 这种复用称为白箱复用 ;继承复用 称为 白箱复用 , 组合 / 聚合 复用 称为 黑箱复用 ;

黑箱复用 看不到 , 如 A 类中包含 B 类 , A 看不到 B 的具体实现细节 ;


三、合成复用原则代码示例

1、继承复用代码示例


业务场景 : 向数据块中添加数据 ; 先获取数据库连接 , 然后向数据库中添加数据 ;


数据块链接类 :

package compositionaggregation;
/**
 * 数据块连接
 */
public class DBConnection {
    public String getConnection() {
        return "数据连接";
    }
}


增加数据类 :

package compositionaggregation;
/**
 * 创造产品
 */
public class ProductDao extends DBConnection {
    /**
     * 增加产品
     */
    public void addProduct() {
        // 先获取连接
        String conn = super.getConnection();
        System.out.println("使用 " + conn + " 增加产品");
    }
}

测试类 :


package compositionaggregation;
public class Main {
    public static void main(String[] args) {
        ProductDao productDao = new ProductDao();
        productDao.addProduct();
    }
}


执行结果 :


image.png



2、合成复用代码示例


数据库连接抽象类 :
package compositionaggregation;
/**
 * 数据块连接
 */
public abstract class DBConnection {
    public abstract String getConnection();
}


Oracle 数据库连接类 :


package compositionaggregation;
/**
 * Oracle 数据块连接
 */
public class OracleConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Oracle 数据库连接";
    }
}

MySQL 数据库连接类 :


package compositionaggregation;
/**
 * MySQL 数据块连接
 */
public class MySqlConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "MySQL 数据库连接";
    }
}

插入数据类 : 通过组合复用 , 注入数据库连接类 ;


package compositionaggregation;
/**
 * 创造产品
 */
public class ProductDao {
    /**
     * 通过组合方式注入数据库连接
     */
    private DBConnection connection;
    public ProductDao(DBConnection connection) {
        this.connection = connection;
    }
    /**
     * 增加产品
     */
    public void addProduct() {
        // 先获取连接
        String conn = connection.getConnection();
        System.out.println("使用 " + conn + " 增加产品");
    }
}

测试类 :


package compositionaggregation;
public class Main {
    public static void main(String[] args) {
        ProductDao productDao = new ProductDao(new OracleConnection());
        productDao.addProduct();
    }
}

执行结果 :


image.png

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
35 0
|
5天前
|
设计模式 开发者
第一篇 设计模式引论 - 探索软件设计的智慧结晶
第一篇 设计模式引论 - 探索软件设计的智慧结晶
|
6天前
|
设计模式 算法 架构师
【搞懂设计模式】设计模式与面向对象原则
【搞懂设计模式】设计模式与面向对象原则
7 1
|
6天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
6天前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
6天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
6天前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
23 2
|
6天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0
|
6天前
|
设计模式 算法 搜索推荐
23种设计模式,策略模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化
28 2
|
6天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
30 4