首页 > 其他分享 >合成复用原则(CRP)

合成复用原则(CRP)

时间:2024-08-11 19:26:18浏览次数:12  
标签:draw CRP 合成 复用 public shape Shape void

目录

一、概念

1. 合成

2. 复用

二、 合成复用原则的优点

1. 降低耦合度

2. 提高灵活性

3. 避免继承的复杂性

三、示例


合成复用原则(Composite Reuse Principle, CRP)是面向对象设计中的一个重要指导原则,强调通过组合(而不是继承)来实现代码复用。它鼓励开发者利用对象的组合关系来增强软件的灵活性和可维护性。

一、概念

1. 合成

 合成是一种“拥有关系”,即一个对象可以包含其他对象,形成复合对象。通过这种方式,一个类可以使用其他类的功能,而无需直接继承。

2. 复用

复用指的是通过已有的组件来构建新的功能,而不是从零开始。

二、 合成复用原则的优点

1. 降低耦合度

使用合成可以减少不同模块之间的依赖关系,从而降低耦合度。特别是在大型系统中,低耦合可以提升代码的可维护性。

2. 提高灵活性

通过合成,可以更容易地替换或扩展对象的行为,只需替换组合的组件,而不必修改已有的类结构。

3. 避免继承的复杂性

继承往往会引入复杂的层次结构和潜在的错误,而合成则能提供更灵活和清晰的设计。

三、示例

        设计一个图形绘制应用,需要不同类型的形状(如圆形和矩形),我们可能使用继承来创建这些形状。

class Shape {
    public void draw() {}
}

class Circle extends Shape {
    @Override
    public void draw() {
        // 绘制圆形
    }
}

class Rectangle extends Shape {
    @Override
    public void draw() {
        // 绘制矩形
    }
}

        在这个设计中,如果我们想为每种形状添加新功能,比如填充颜色,我们可能需要更改现有的类,甚至可能得创建许多子类,这可能导致代码难以维护。         合成复用设计:使用合成,我们可以设计一个 Shape 接口和多个具体的形状类,而将颜色的填充功能提取到一个独立的类中。

interface Shape {
    void draw();
}

class Circle implements Shape {
    @Override
    public void draw() {
        // 绘制圆形
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        // 绘制矩形
    }
}

class ColorFill {
    private String color;

    public ColorFill(String color) {
        this.color = color;
    }

    public void applyFill(Shape shape) {
        // 应用颜色填充到形状
    }
}

// 使用组合
class ShapeWithColor {
    private Shape shape;
    private ColorFill colorFill;

    public ShapeWithColor(Shape shape, ColorFill colorFill) {
        this.shape = shape;
        this.colorFill = colorFill;
    }

    public void draw() {
        shape.draw();
        colorFill.applyFill(shape);
    }
}

在这个设计中,形状类(如 Circle 和 Rectangle)与填充颜色的功能(ColorFill)是分开的。可以轻松地组合不同的形状和颜色,而不需要创建复杂的类层次结构。


 

标签:draw,CRP,合成,复用,public,shape,Shape,void
From: https://blog.csdn.net/m0_65347933/article/details/141095865

相关文章

  • 关于 agKc 实在不喜欢自动化于是啥都自己合成这件事
    关闭同步/解除绑定后,不能使用puts勤对拍(除非实在难以对拍的题目),像这种错误,只有对拍才有发现的可能性点击查看代码#include<bits/stdc++.h>usingnamespacestd;vector<pair<longlong,longlong>>a[100005];vector<longlong>s;longlongt[100005],n,k;boolf;long......
  • AFIO专题1:GPIO引脚复用和重映射
    1、GPIO的复用功能STM32上有很多片上外设,这些外设的外部引脚都是与GPIO口复用的。也就是说,一个GPIO口如果可以复用为片上外设的功能引脚,那么当这个GPIO作为片上外设使用的时候,就叫做复用。因此,使用外设功能配置GPIO输出时都要设置成复用输出模式:GPIO_Mode_AF_PP或GPIO_Mode_A......
  • select多路复用(tcp通信)
    文章目录项目名称项目结构项目名称io_demo1项目结构$tree.├──build├──CMakeLists.txt├──debug.gdb├──include│├──mysocket.h│├──tcp_client.h│└──tcp_server.h├──sources│└──server.cpp└──sr......
  • C# & Unity 面向对象补全计划 七大原则 之 合成/聚合复用原则( CARP)难度:☆☆☆☆ 总结:
    本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正本系列作为七大原则和设计模式的进阶知识,看不懂没关系请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺1.合成/聚合复用原则(CARP)        合成/聚合复用原则就是在一个新的对象里面使用一些已有的......
  • BMC Genomics | 综合代谢组学和转录组学分析揭示了菊花黄酮和咖啡酰奎宁酸的生物合成
    杭白菊是一种流行的药用和食用植物,主要通过黄酮类和咖啡酰奎宁酸(CQAs)的存在发挥其生物活性。然而,菊花头状花序中黄酮和CQA生物合成的调控机制尚不清楚。本研究采用高效液相色谱法测定了菊花头状花序发育过程中黄酮类化合物和CQAs的含量,发现在S1和S2阶段含量较高,在S3~S5阶段含......
  • 不平衡学习的自适应合成采样方法ADASYN(Matlab代码实现)
     ......
  • python装饰器提高代码复用,减少代码量,简洁易懂
    装饰器提高代码复用,减少代码量对于一个程序程序,无论是c、java、go还是python,组成这段程序的代码需要越简单越好,要知道程序的代码越简单,代码量越少,出错的概率就小,维护起来也简单。针对python语言,装饰器是我最近发现的针对简化代码,特别有帮助的工具。下面我用两段代码,演示一下同样......
  • 【大模型书籍PDF】LangChain入门指南:构建高可复用、可扩展的LLM应用程序( 推荐)
    今天又来给大家推荐一本大模型方面的书籍<Langchain入门指南>这本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章,从LLM基础知识开始,通过LangChain这个开源框架为读者解读整个LLM应用开发流程。......
  • io多路复用
    io多路复用:文件描述符fd:简单的理解就是磁盘上文件的索引,我们通过客户端程序想要操作磁盘上的文件,是不能直接操作磁盘上的文件的,都是操作的这个文件描述符,然后通过这个文件描述符操作磁盘上的文件。有三种类型:一种是select模型,一种是poll模型,一种是epoll模型。Epoll是Linux底层......
  • http/1.0、http/1.1、http/2关于复用这块的理解
    一概述http/1.0 请求响应模式,请求发送到服务器,服务器响应结果后连接立马关闭。由于Http1.0底层使用的是TCP。 需要完整的经理TCP三次握手和四次挥手。下次发起请求时重复以上步骤。http/1.1 请求响应模式,可共享链接,但是需要一个请求-响应结束后才能发起另一个请求-响应。默......