面向对象设计原则七:组合/聚合复用原则

面向对象设计原则七:组合/聚合复用原则

组合/聚合复用原则(LSP) 定义:优先使用组合,使系统更灵活,其次才考虑继承,达到复用的目的。重用的方式: 继承、组合、聚合解释说明: 继承:在我们想复用代码时,我们一般会优先想到继承,但是具有继承关系的两个类是耦合度最高的两个类。(父类改了子类可能会受影响,子类改了父类也可能会受影响) 如果父类的功能比较稳定,建议使用继承来实现代码复用,因为继承是静态定义的,在运行时无法动态调用。 组合:是整体与部分的关系,整体离不开部分,部分离开了整体没有意义,如飞机翅膀与飞机的关系。 聚合:也是整体与部分的关系,但整体可以分离部分,部分也可以离开整体,如火车与车厢的关系。组合/聚合:是通过获得其他对象的引用,在运行时刻动态定义的,也就是在一个对象中保存其他对象的属性,这种方式要求对象有良好定义的接口,并且这个接口也不经常发生改变,而且对象只能通过接口来访问,这样我们并不破坏封装性,所以只要类型一致,运行时还可以通过一个对象替换另外一个对象。

示例1:组合

1 using System;

2 using System.Collections.Generic;

3 using System.Linq;

4 using System.Text;

5 using System.Threading.Tasks;

6

7 namespace 组合聚合复用原则

8 {

9 ///

10 /// 定义一个飞机翅膀类

11 ///

12 public class Airfoil

13 {

14 ///

15 /// 定义方法

16 ///

17 public void AdjustAngle()

18 {

19 Console.WriteLine("调整角度");

20 }

21 }

22

23 public class Plane

24 {

25 // 定义一个私有的飞机翅膀类的变量

26 private Airfoil airfoil;

27 // 省略setter、getter

28 public void Fly()

29 {

30 // 使用组合实现代码的复用

31 airfoil.AdjustAngle();

32 }

33 }

34 }

上面代码中飞机翅膀和飞机之间使用继承就不太合适,本身也就是组合关系,这样就实现了代码的复用。在平常使用最多的就是在一个对象中声明另外一个对象的变量。

示例2:聚合

1 using System;

2 using System.Collections.Generic;

3 using System.Linq;

4 using System.Text;

5 using System.Threading.Tasks;

6

7 namespace 组合聚合复用原则

8 {

9 ///

10 /// 定义一个车厢类

11 ///

12 public class RailwayCarriage

13 {

14 public void Loading()

15 {

16 Console.WriteLine("车厢装载118人");

17 }

18 }

19

20 ///

21 /// 定义一个火车类

22 ///

23 public class Train

24 {

25 // 定义一个私有的车厢类的变量(在一个类中定义另外一个类的引用)

26 private RailwayCarriage rc;

27 // 省略setter、getter

28 public void Carry()

29 {

30 // 可以使用车厢,也可以不使用车厢

31 if(rc!=null)

32 {

33 rc.Loading();

34 }

35 Console.WriteLine("车头装载5人");

36 }

37

38 public void Run()

39 { }

40 }

41 }

代码下载链接:https://files.cnblogs.com/files/dotnet261010/OO%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.rar

相关推荐

手机老是死机怎么回事?教你快速解决死机问题!
世界杯来了
365bet主页器

世界杯来了

📅 06-29 👁️ 2855
英格兰半决赛历史盘点:两次倒在点球大战,一次加时遭绝杀
阴虱脱离人体后活多久(阴虱离开人后存活时间)