对象组合与委托

来源:互联网 发布:linux 三大命令wc grep 编辑:程序博客网 时间:2024/06/06 21:43

        在讨论这个话题之前,我想先来谈谈我的一段经历:我是一个今年刚毕业的应届毕业生。相信大家都知道一个应届毕业生都会碰到的问题是落户问题,我们的户口需要从学校 所在地转到现在工作的地方。但是,一般来说,单位是没有权利来保管一个员工的人事档案的,我们需要将档案存放到当地人事局的一个下属机构(比如我现在是要将档案存放到杭州是人事局下属的杭州市人才开发中心)。在杭州市人才开发中心有一个人事代理这样一个业务,我们可以拿着 所在工作的公司的一份人事委托书 到人才开发中心的人事代理窗口便可以存放档案的手续了,这样我们便 可以将我们的档案存放在人才开发中心的档案库里了。

        在这里我 罗里罗嗦地举了上面的这样的一个例子,主要是为了谈谈我对委托的理解:公司没办法做存放档案这样一件事,而且也不准备也没有必要来做一件可以有人事部门来完成的工作,因为他们知道他们只要将这件事委托给杭州市人才开发中心或者其他的人事局的下属部门便可以完成了,而且也根本没有必要知道这些事情到底是怎么样来完成的。这就是我们生活当中的委托,从生活中的例子来理解软件开发中的委托,相信回更容易些。

        以上举了一个生活中委托的例子,对于对象组合这个概念,本人一时还没有想到一个比较贴切的例子,等以后想到了再加吧。:)。下面我们从面向对象程序设计这个角度来看看对象组合到底是怎么回事吧 :相信熟悉面向对象设计的朋友都回知道有这样的一条设计原则:“优先使用对象组合,而不是类继承”。其实类继承和对象组合都是面向对象系统中功能复用的最常用的方法,前者是通过生成子类的方法来实现,后者是通过对象组合来获得。至于二者的区别不是本文讨论的要点,下面我们主要具体看看对象组合。

        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。具体的说是一个解决方法通过继承抽象类或接口,在运行的时候才决定具体是调用哪个对象。这里我们不会想类继承一样破坏父类的封装性,同时因为对象的实现是基于接口的,所以实现上存在较少的依赖性。

        讲了大半天的委托和对象组合,现在我们再来看看对象组合和委托到底存在一个什么样的关系。其实委托用的就是对象组合的方法,它使组合具有与继承同样的复用功能,在委托方式下,有两个对象参与处理一个请求接收请求的对象将操作委托给他的代理者。这类似与子类将他的请求交给他的父类来处理。

        下面举一个例子来说明一下这个问题:(窗口类将他的Area方法操作委托给一个矩形实例)

 

上面Window指向Rectangle的箭头表示一个类对另一个类实例的引用关系,这里我需要得到一个Area()的值,只有在运行阶段才动态的决定是返回一个Rectangle还是Circle的Area()

上面的这个例子比较具体的说明了如何通过对象组合的方式来达到面向对象系统功能复用的目的。当然我们还可以通过window类来继承Rectangle类的方法来实现得到一个矩形面积的目的,但这种方法无论是从扩展性还是灵活性的角度上看都是不合理的。

后记:本文是鄙人在最近学习面向对象和设计模式过程中(特别是学习《设计模式》这本书过程中)的一个小结,可能很地方表达是不过确切的,全当是一篇自己的读书笔记了。

原创粉丝点击