首页 理论教育 大话设计模式:儿子功课操作型模式

大话设计模式:儿子功课操作型模式

时间:2023-11-03 理论教育 版权反馈
【摘要】:第十九章儿子的功课——操作型模式19.1儿子的功课时间:1月4日地点:大B的朋友小李家人物:大B的朋友小李、小李的老婆LL、小李的儿子强强强强:“老妈,这个题不会做了帮帮我。”

大话设计模式:儿子功课操作型模式

第十九章 儿子的功课——操作型模式

19.1 儿子的功课

时间:1月4日  地点:大B的朋友小李家  人物:大B的朋友小李、小李的老婆LL、小李的儿子强强

强强:“老妈,这个题不会做了帮帮我。”

LL:“要先这样,然后在这样就行了。”

强强:“老妈,这个又不会了。”

LL:“这个我也不会,问你老爸去吧!”

小李:“这么简单呀!你们俩去看电视吧,我做完了叫你。”

19.2 操作型模式

大B:“我们在编写一个Java方法时,完成的是整个编码工作的一个基本单位,层次要高于一条语句。设计的方法必须参与整个应用设计、架构和测试计划中;不过在面向对象编程中,编写方法是中心。”

小A:“这样说来方法真的很重要喔。”

大B:“尽管方法如此重要,但是对于方法是什么,方法是如何运行的,却很容易使人感到困惑。我们必须知道Java方法的语法细节。最令人不可思议的是,很多开发人员和图书的作者经常混淆方法和操作这两个概念。算法多态性这两个概念更加抽象,但最终也是由方法实现的。”

小A:“是啊!”

大B:“我们只有弄清楚诸如算法、多态性、方法和操作等术语的不同意义,才能够准确地理解众多设计模式中所涉及的重要概念。特别是State(状态)模式、Strategy(策略)模式,以及Intepreter模式,都需要跨越几个类的方法来实现一个操作。只有当我们对方法和操作的含义达成了共识,这样的表达才具有意义。”

19.3 要点

小A:“操作型模式有什么要点呢?”

大B:“State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换响应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解藕。为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的--即要么彻底转换过来,要么不转换。如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。这种模式避免了我们写大量的if else或switch case语句,但是很有可能会导致某些系统有过多的具体状态类,并且由此导致开发人员可能会对所有的状态类有所遗漏。”

19.4 操作和方法

小A:“在有关类的众多术语中,尤其需要注意区分操作与方法这两个概念。”

大B:“是的。UML是这样定义操作和方法的:1、操作就是能够被类的实例调用的服务的规范2、方法则是操作的实现。”

大B:“注意,操作是在方法之上的抽象概念操作定义类所提供的服务,并给出调用该服务的接口。多个类可以用不同的方法实现同一个操作。例如,很多类都以自己的方式实现toString()操作。而每个类都是通过实现方法来提供某种操作,操作的实现代码构成了类的方法。通过对方法和操作进行定义,我们可以澄清很多设计模式的结构。操作的含义是从方法的概念上抽象而来的。由于设计模式也是从类和方法升华而来,因而,在很多设计模式中,操作都发挥着非常重要的作用。例如,在Composite模式中,一个操作既被应用于叶节点对象上,又被应用于组合对象上。而在Proxy模式中,一个中介者对象与目标对象具有相同的操作,从而使用得中介者对象可以管理对目标对象的访问。同样,责任链(Chain of Responsibility)模式是在一个对象链上分发某个操作。每个对象的方法要么直接实现该方法的业务,要么将对该方法的调用转发到责任链上的下一个对象。”

19.5 签名

小A:“表面上,操作的含义与签名的含义很类似。”(www.xing528.com)

大B:“是啊!两个词指的都是方法的接口。”

小A:“喔。”

大B:“当编写方法时,遵循签名就可以之:方法签名包括方法名、形式参数的数目和类型。注意,方法签名不包括返回类型。但是,如果一个方法重写了另一个方法,而这两个方法的返回类型不同,那么编译时就会报错。在客户端调用方法时,方法签名指明应该调用哪个方法。操作是可请求的服务的规范。术语签名与操作的含义很类似,但是名字本身并不同义。这两个术语的不同之处主要体现在所使用的上下文环境中。当研究不同类中的方法可能会有相同接口时,使用术语操作。当研究Java如何将一个方法调用映射到接收对象的方法时(具体方法),使用术语签名。签名依赖于方法名和参数,但不依赖于返回类型。”

19.6 异常

小A:“运行正常时,方法会返回正确的结果;有时候,方法也会抛出异常,或者调用其他抛出异常的方法。当方法正常返回结果时,程序会从上次的调用点之后继续执行。”

大B:“当发生异常时,则需要应用不同的规则集。当抛出异常时,Java执行环境必须找到与该异常相符的try/catch语句。如果在当前的方法调用的栈中没有发现相符的try/catch语句,程序会停止,甚至崩溃。”

19.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支持多态性机制。”

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈