翼度科技»论坛 编程开发 .net 查看内容

必知必会的设计原则——合成复用原则

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
 设计原则系列文章 

概述

在面向对象设计中,可以通过两种方法在不同的环境中复用已有的设计和实现,即通过组合/ 聚合关系或通过继承,但首先应该考虑使用组合/聚合,组合/聚合可以使系统更加灵活,降低 类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂 度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继 承复用。合成复用原则又称为组合/聚合复用原则;尽量使用对象组合,而不是继承来达到复用。
“某种程度上 继承有问题”:破坏了系统的封装性,基类发生了改变,子类的实现也会发生改变;子类如果不需要基类中的方法,那么系统耦合性就开始变高;继承是静态的,不能在程序运行时发生改变;

以上图片展示的关于汽车继承案例问题,这个需求如果增加,可以一直继承下去,系统慢慢...
继承案例代码
  1.     public class A
  2.     {
  3.         public void Methond1()
  4.         {
  5.             Console.WriteLine("我是方法1");
  6.         }
  7.         public void Methond2()
  8.         {
  9.             Console.WriteLine("我是方法2");
  10.         }
  11.         public void B_Methond3()
  12.         {
  13.             Console.WriteLine("我是方法3");
  14.         }
  15.     }
  16.     public class B : A
  17.     {
  18.       
  19.         public void MethondB()
  20.         {
  21.         }
  22.     }
  23.     public class C : B
  24.     {
  25.         public void MethondC()
  26.         {
  27.         }
  28.     }
  29.     public class D : C
  30.     {
  31.         public void MethondD()
  32.         {
  33.         }
  34.     }
复制代码
结论:问题是有些方法B类并不需要,然而在A类中实现后,B类都需要继承,这就是问题,导致职责不清晰,越来越臃肿!以后新增需求,像C又继承B...
关于汽车案例的需求改用合成复用原则实现
  1.   public interface IColor
  2.     {
  3.         public string ShowCar();
  4.     }
  5.     public class Green : IColor
  6.     {
  7.         public string ShowCar()
  8.         {
  9.             return "绿色";
  10.         }
  11.     }
  12.     public class Red : IColor
  13.     {
  14.         public string ShowCar()
  15.         {
  16.             return "红色";
  17.         }
  18.     }
  19.     //)——————————————————————————————————————————————————
  20.     public abstract class Car
  21.     {
  22.         public abstract void Run(IColor color);
  23.     }
  24.     public class QyCar : Car
  25.     {
  26.         public override void Run(IColor color)
  27.         {
  28.             Console.WriteLine($"汽油式的{color.ShowCar()}颜色车在行驶");
  29.         }
  30.     }
  31.     public class DdCar : Car
  32.     {
  33.         public override void Run(IColor color)
  34.         {
  35.             Console.WriteLine($"电动式的{color.ShowCar()}颜色车在行驶");
  36.         }
  37.     }
复制代码
结论:像这个汽车行驶的需求,不管以后又有黑色的、蓝色的汽车,或者加水的汽车之类都做好了扩展,不用再使用继承去解决这个问题。
总结

关于合成复用原则在现实编码过程中,尤其对重构系统特别有用,所有的设计原则系列文章都已经更新完毕,有何疑问,欢迎交流。

来源:https://www.cnblogs.com/mhg215/archive/2023/02/14/17117235.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具