景区微网站 建设方案,建设境外网站,陌陌网站开发成本,网站的统计代码是什么意思#x1f9d1;#x1f4bb;作者#xff1a;猫十二懿 ❤️#x1f525;账号#xff1a;CSDN 、掘金 、个人博客 、Github #x1f389;公众号#xff1a;猫十二懿 合成-聚合复用原则
1、合成-聚合复用原则介绍
合成/聚合复用原则#xff08;Composition/Aggregatio… 作者猫十二懿 ❤️账号CSDN 、掘金 、个人博客 、Github 公众号猫十二懿 合成-聚合复用原则
1、合成-聚合复用原则介绍
合成/聚合复用原则Composition/Aggregation Reuse PrincipleCARP是一种面向对象设计原则它提倡通过合成/聚合关系组合关系来达到代码复用的目的而不是通过继承关系。
1.1 继承与组合对比
CARP 的基本思想是在设计类之间的关系时优先选择合成/聚合关系而不是继承关系。通过将对象组合在一起形成更大的对象来达到复用的目的。
继承关系在某些情况下可能导致代码的耦合性增加使得系统的灵活性和可维护性下降。
而合成 / 聚合关系则可以更加灵活地组合对象使得系统的结构更加松散各个对象之间的耦合度降低。
1.2 合成与聚合
聚合表示一种弱的 拥有 关系体现的是A对象可以包含B对象但B对象不是A对象的一部分。
合成则是一种强的 拥有 关系体现了严格的部分和整体的关系部分和整体的生命周期一样。 比如说 大雁有两个翅 膀翅膀与大雁是部分和整体的关系并且它们的生命周期是相同的于是大雁和翅膀就是合成关系。而大雁是群居动物所以每只大雁都是属于一个 雁群一个雁群可以有多只大雁所以大雁和雁群是聚合关系。 又比如 合成和聚合是两种描述对象间关系的方式合成表示整体包含部分它的组成部分不能再单独存在例如汽车由底盘发动机车身等构成。聚合则表示整体与部分之间是一 种“拥有”的关系部分可以存在于整体之外例如公司与员工之间的关系。 2、合成/聚合案例说明 假设我们有一个简单的图形绘制程序需要绘制不同形状的图形比如矩形和圆形。我们可以使用合成/聚合复用原则来设计这个程序。 2.1 使用合成/聚合复用原则
首先让我们使用合成/聚合原则来实现这个例子。我们定义一个抽象类Shape作为所有图形的基类其中包含一个抽象方法draw()用于绘制图形。然后我们创建两个具体类Rectangle和Circle它们分别实现Shape类并重写draw()方法来实现矩形和圆形的绘制逻辑。
// 图形抽象类
abstract class Shape {public abstract void draw();
}// 矩形绘制
class Rectangle extends Shape {Overridepublic void draw() {System.out.println(绘制矩形);}
}// 圆形绘制
class Circle extends Shape {Overridepublic void draw() {System.out.println(绘制圆形);}
}接下来我们可以在绘制程序中使用这些图形类。我们创建一个Drawing类其中包含一个drawShape()方法它接收一个Shape对象并调用draw()方法来绘制图形。
class Drawing {public void drawShape(Shape shape) {shape.draw();}
}现在我们可以使用以下代码来绘制矩形和圆形
public class Main {public static void main(String[] args) {Shape rectangle new Rectangle();Shape circle new Circle();Drawing drawing new Drawing();drawing.drawShape(rectangle); // 绘制矩形drawing.drawShape(circle); // 绘制圆形}
}通过合成/聚合复用原则我们通过将Drawing类与Shape类组合起来实现了绘制程序的复用和灵活性。我们可以轻松地扩展程序添加新的图形类而不需要修改现有的代码。符合了开闭原则 2.2 不使用合成/聚合复用原则
现在让我们看看如果不使用合成/聚合复用原则直接使用继承关系来实现这个例子会出现什么问题。
class Rectangle extends Shape {Overridepublic void draw() {System.out.println(绘制矩形);}
}class Circle extends Rectangle {Overridepublic void draw() {System.out.println(绘制圆形);}
}在这个例子中我们将圆形类直接继承自矩形类这样的设计违反了合成/聚合复用原则。虽然代码看起来似乎工作正常但这种设计存在一些问题。
首先这种设计导致圆形与矩形之间存在不必要的继承关系。圆形并不是一种特殊的矩形它们的行为和属性是不同的。这样的继承关系破坏了类的单一职责原则和 Liskov替换原则增加了代码的复杂性和维护成本。
其次如果我们想要添加其他形状比如三角形或椭圆形我们将不得不在继承关系中继续扩展比如创建一个Triangle类继承自Shape或者创建一个Ellipse类继承自Circle这样的扩展会导致类的层级结构变得复杂难以管理和扩展。
另外使用继承关系来实现不同形状的绘制逻辑限制了我们在运行时动态地改变图形的行为。例如如果我们想要在运行时切换一个图形的绘制方式使用继承关系就无法实现这种灵活性。
综上所述如果不使用合成/聚合复用原则直接使用继承关系来实现图形绘制程序会导致类之间的耦合度增加继承关系的滥用限制了系统的灵活性和扩展性。而使用合成/聚合复用原则通过组合对象可以实现更松散的耦合更灵活的设计和扩展使得代码更易于维护和修改。
3、合成/聚合复用原则CARP的总结
合成/聚合复用原则的优点
降低耦合性通过使用合成/聚合关系而不是继承关系可以减少类之间的依赖性降低系统的耦合度。提高灵活性合成/聚合关系允许在运行时动态地组合对象使得系统更加灵活可以根据需要进行组合和重组。支持扩展和修改使用合成/聚合关系可以轻松地添加、修改或替换组件而不会对现有的代码产生影响提高了系统的可维护性和可扩展性。遵循单一职责原则合成/聚合关系使得每个类都可以专注于自己的职责提高了类的内聚性和可读性。
合成/聚合复用原则的缺点
增加代码复杂性使用合成/聚合关系可能需要引入更多的类和接口增加了代码的复杂性和理解成本。需要更多的设计和管理合成/聚合关系需要更加细致的设计和管理以确保正确地组合和使用对象否则可能导致不必要的复杂性和错误。
合成/聚合复用原则的适用场景
当需要在运行时动态地组合和重组对象或者需要支持灵活的配置和扩展时合成/聚合复用原则是非常适用的。当类之间的关系不是is-a的继承关系而是has-a的组合关系时使用合成/聚合关系更加合适。例如部分-整体的关系、装饰器模式等场景都可以通过合成/聚合关系来实现。
总结来说CARP原则通过合成/聚合关系来实现代码的复用和灵活性相比于继承关系它能够降低代码的耦合性提高了系统的可维护性和可扩展性。然而它也会增加代码的复杂性需要更多的设计和管理。在需要动态组合对象、支持灵活配置和扩展的场景中CARP原则是一个有价值的指导原则。