zoukankan      html  css  js  c++  java
  • 面向对象设计原则七:组合/聚合复用原则

    组合/聚合复用原则(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     /// <summary>
    10     /// 定义一个飞机翅膀类
    11     /// </summary>
    12     public class Airfoil
    13     {
    14         /// <summary>
    15         /// 定义方法
    16         /// </summary>
    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     /// <summary>
    10     /// 定义一个车厢类
    11     /// </summary>
    12     public class RailwayCarriage
    13     {
    14         public void Loading()
    15         {
    16             Console.WriteLine("车厢装载118人");
    17         }
    18     }
    19 
    20     /// <summary>
    21     /// 定义一个火车类
    22     /// </summary>
    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 }

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

  • 相关阅读:
    HDU 1175 连连看 (DFS+剪枝)
    CF702F T-Shirts
    UVA12538 Version Controlled IDE
    P2605 [ZJOI2010]基站选址
    P3835 【模板】可持久化平衡树
    CF915E Physical Education Lessons
    P3701 「伪模板」主席树
    P1198 [JSOI2008]最大数
    P3466 [POI2008]KLO-Building blocks
    P3919 【模板】可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/7351809.html
Copyright © 2011-2022 走看看