当前位置: 首页>>技术问答>>正文


协会,聚合和组合的使用是什么?

貔貅 技术问答 , 去评论

问题描述

我已经经历了关于什么是封装和实现它的三种技术的很多理论,这些是协会,聚合和组合。

我发现是:

Encapsulation

封装是将类中的字段设为私有的技术,并通过公共方法提供对字段的访问。如果一个字段被声明为私有的,则该类外的任何人都无法访问该字段,从而隐藏该类中的字段。因此,封装也被称为数据隐藏。

封装可以被描述为防止代码和数据被类外定义的其他代码随机访问的保护屏障。访问数据和代码由界面严格控制。

封装的主要优点是可以修改我们实现的代码,而不会破坏使用我们的代码的其他人的代码。通过此功能,Encapsulation为我们的代码提供了可维护性,灵活性和可扩展性。

Association

协会是一种关系,所有对象都有自己的生命周期,没有所有者。让我们举个例子说教师和学生。多个学生可以与单一老师联系,一个学生可以与多个教师联系,但对象之间没有所有权,并且都有自己的生命周期。两者都可以独立创建和删除。

Aggregation

聚合是一种专门的关联形式,其中所有对象都有自己的生命周期,但存在所有权,子对象不能属于另一个父对象。我们举一个部门和老师的例子。单身老师不能属于多个部门,但如果我们删除部门,教师对象不会被销毁。我们可以将其视为“has-a”关系。

Composition

组合也是一种专门的聚合形式,我们称之为“death”关系。它是一种强有力的聚合。子对象没有其生命周期,如果父对象删除所有子对象也将被删除。让我们再来一个房子和房间之间的关系的例子。房子可以包含多个房间,但没有房间的独立生活,任何房间都不能属于两个不同的房子。如果我们删除房子,房间将自动删除。

问题是:

现在这些都是现实世界的例子。我正在寻找一些关于如何在实际的类代码中使用这些技术的描述。我的意思是使用三种不同的封装技术,这些技术可以如何实现,以及如何选择哪种技术适用于时间。

最佳解决思路

您所描述的关联,聚合和组合之间的区别是回到旧版手动内存管理的遗留问题。例如在C++中,对象所使用的内存必须手动释放,因此仔细设计组合对象的生命周期至关重要。虽然聚合和组合之间的区别仍然由许多教科书教授,但在具有自动内存管理的环境中进行编程时,这本质上是无关紧要的。如果你有垃圾收集,他们都只是组合,期间。

另一方面,封装是比你所描述的更一般的原则。最重要的是在一个模块中捆绑数据和对这些数据进行操作的功能。实现这一点的一种方法是通过将模块的状态保持为私有状态,并通过公共服务公开对该状态的更改。所以客户端不能自己访问状态,而是必须通过发送消息来告诉模块他们的意图。因此,封装不限于对象,也适用于服务。实际上,查看对象的一种方法是将它们视为服务。

这是封装的一个例子

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

或使用lambda函数相同

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

在这两种情况下,数据(即变量n)与其上运行的函数inc捆绑在一起。而且没有任何其他功能可以访问n,因此我们有一个封装的模块,提供计数作为一个服务。

注意:通过访问器暴露所有对象的内部状态实际上是违反封装。唉,这是一个常见的违规行为,许多人会把它与好的object-oriented设计混淆。

次佳解决思路

封装是将类中的字段设为私有的技术,并通过公共方法提供对字段的访问。如果一个字段被声明为私有的,则该类外的任何人都无法访问该字段,从而隐藏该类中的字段。因此,封装也被称为数据隐藏。

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

参考这个问题also

关联表示对象之间的关系。例如:电脑使用键盘作为输入设备。

当一个对象想要另一个对象为其执行服务时,使用关联。

聚合是一种特殊的关联情况。对象之间的方向关联。当一个对象’has-a’另一个对象,那么你们之间有一个聚合。

例如:房间有一张桌子,但桌子可以没有房间存在。

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

组合是聚合的特殊情况。构图更具限制性。当两个对象之间存在组合时,如果没有其他对象,则组合对象不能存在。这个限制不在聚合中。例如:房子里的房间,在房子的一生之后不能存在。

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

组合是通过继承或对象组合来实现类中的has-a关系的一种设计技术,用于代码重用。

Java编程中最佳实践之一是使用组合继承

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/192134.html,未经允许,请勿转载。
Go