目录
前言
文章将先阐述对合成复用原则的理解和实践,接着再进行类之间六种关系(泛化、实现、组合、聚合、关联、依赖)的图解介绍。
一、合成复用原则阐述
1概念理解
合成复用原则又称为组合、聚合复用原则,要求尽量使用对象组合,而不是继承来达到复用的目的。
为什么不能使用继承达到复用?
继承会破坏了系统的封装性,基类如果发生了改变,子类的实现也会发生改变,如果子类不需要某个方法,系统耦合性变高(这里指的是接口),继承是静态的。
这一点在之后的实例中也会详细说明。
合成复用原则的核心思想是:在编写代码时如果需要使用其它类,那么两个类之间尽量使用合成/聚合的方式,而不是使用继承。传递的一种设计思路就是:我们可以通过类之间的“合成”来达到“复用”代码的诉求。
合成复用的好处就是解决了使用继承带来的缺点,不过任何事物有好就有坏,这是必然的。合成复用存在的缺点就是在系统中会存在较多的对象需要管理。
还有一点需要注意:不是不使用继承,而是尽量先考虑使用“合成”复用,其次在考虑使用“继承”复用。
2.原则运用实例
在汽车这个抽象类中,如果子类全部使用继承实现方法Run(),子类对象将会变的很多且难以管理和扩展,就会是这样的效果:
如果将继承中的一部分转化为对象组合,如图设置IColor接口,封装showColor方法,将自身作为参数传入Car类中,实现对象的组合,可以将代码精简,且易于扩展,使得复用性提高
下面是具体的代码实现:
public class ReusePrinciple : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Car dcar = new DCar();
dcar.Run(new Green());
}
}
//将重要的部分变为单独的接口
public interface IColor
{
string ShowColor();
}
//分别设置两个实现类
public class Green : IColor
{
public string ShowColor()
{
return "绿色";
}
}
public class Red : IColor
{
public string ShowColor()
{
return "红色";
}
}
//定义抽象类
public abstract class Car
{
public abstract void Run(IColor color);
}
public class DCar : Car
{
public override void Run(IColor color)
{
Debug.Log("颜色为:" + color.ShowColor() + "D车在行驶");
}
}
从汽车具体类型的这个案例中,我们可以得出合成复用原则更实际性的定义:
合成复用原则是将已有的对象纳入到新对象中,作为新对象的对象成员来实现的,新对象可以调用已有对象的功能,从而达到复用
二、类与类之间的关系
1.泛化
实际上就是继承,如图Animal是Tiger的泛化,(继承了Animal的)Tiger是Animal的特化
2.实现
类与接口的关系,表示类实现了接口。Tiger类实现了IClimb接口
3.组合
组合是整体和部分强拥有的关系,部分没有独立的生命周期,组合是把部分作为整体的一个对象。如下图,Tiger将部分Leg作为一个对象,这也是合成复用原则的体现
4.聚合
聚合是整体和部分弱拥有的关系,部分有无不是很重要。个体部分具有独立的生命周期,聚合是把个体对象的指针(引用)作为整体类的属性
5.关联
关联是一种拥有关系,它使得一个类得知另一个类的属性/方法。比如Tiger可以得知Food类的foodName属性 (在Tiger类中拥有Food类的字段)
6.依赖
依赖就是一种使用关系,一般是作为参传入具体的方法(我在这篇博客中做了详细的阐释与使用场景依赖倒置原则的理解与具体实现 C# Unity_花火の云的博客-CSDN博客)