书城计算机大话设计模式
11030400000148

第148章 7 算法和多态性

大B:“算法和多态性是编程中的主要思想,但是靠这些术语,我们很难表述其具体含义。如果想向其他人表示一个方法,你可以编辑源代码,然后据此向其他人仔细讲述。”

小A:“喔。”

大B:“在某些情况下,算法也许完全包含在一个方法中。但是算法的实现经常依赖于多个方法的相互使用。”

小A:“嗯。”

大B:“Introduction to Algorithms(算法导论)给出了算法的定义:算法是定义良好的计算过程,把数据值或者数据集合作为输入,并输出某数据值或者数据集合。算法是一个过程――包含一些指令序列,接收输入,产生输出。”

小A:“嗯。”

大B:“单个方法也许是个算法:它接受输入――其参数列表――并产生输出作为返回值。然而,在面向对象编程时很多算法会需要多个方法。算法就是需要完成某项任务的过程。它们也许表现为某方法的一部分,或者调用多个方法。在面向对象应用程序中,需要多个方法的算法经常依赖多态性来充许单个操作的多种实现。”

小A:“多态性是方法调用关于依赖被调用的操作和调用接收者类的基本原则。”

大B:“是啊!比如,你也许关心当Java遇到表达式isTree()时,会执行哪个方法。这关键是看方法的依赖关系。”

小A:“喔。”

大B:“如果对象m是Machine类的实例Java会调用Machine。isTree()。如果m是MachineComposite的一个实例,Java会调用MachineComposite。isTree()。非正式地说,多态性意味着要为合适的对象调用合适的方法。很多设计模式都使用多态性,在某些情况下,多态性与该模式的目标紧紧相连。”

小A:“操作、方法、签名以及算法这四个概念很容易让人混淆。”

大B:“但是,搞清楚这些术语间区别将有助于我们描述一些重要的概念。”

小A:“是啊!”

大B:“操作,类似于方法签名,定义了服务的规范。当谈到许多方法可能会有相同的接口的时候,我们可以使用操作这个术语。当讨论方法查询规划的时候,我们可以使用签名这个术语。一个方法的定义包括方法签名、修饰符、返回类型以及方法体;而方法签名又包括方法名和参数列表。一个方法通常有一个方法签名,并实现一个操作。启动一个方法的常见方式是调用它。方法结束的常见方式是让它返回,但是对任务程序而言,当遇到不可处理的异常时,任何方法都会停止执行。算法是一个接收输入并产生输出的过程。方法也接收输入、产生输出,另外它还包含一个过程化的方法体,因此常常有人将方法体看作是一个算法。然而,一个算法的过程可能会涉及很多操作和方法,也可能仅仅是另外一个方法的一部分。算法这个术语最好是在谈到产生某个结果的过程时使用。很多设计模式都涉及到把一个操作分散到几个类中去。因而我们可以说这些模式依赖于多态性,即具体调用哪个方法依赖于收到调用的对象的类型。不同的类可以用不同的方式来实现同一个操作。换句话说,Java支持多态性机制。”