操作型模式简介

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

 

1   操作和方法

    在有关类的众多术语中,尤其需要注意区分操作和方法这两个概念。UML用下面的定义给出了操作和方法之间的不同之处:

(1)操作就是能够被类实例调用的服务的规范

(2)方法则是操作的实现

注意,操作是在方法之上的抽象概念

     操作定义类所提供的服务,并给出调用该服务的接口。多个类可以用不同的方式实现同一个操作。例如,很多类都以自己的方式实现toString()操作。而每个类都是通过实现方法来提供某种操作,操作的实现代码构成了类的方法。

     通过对方法和操作进行定义,我们可以澄清很多设计模式的结构。操作的含义是从方法的概念上抽象而来的。由于设计模式也是从类和方法升华而来,因而,在很多设计模式中,操作都发挥着非常重要的作用。例如,在Composite模式中,一个操作即被应用于叶节点对象上,又被应用于组合对象上。而在proxy模式中,一个中介者对象与目标对象具有相同操作,从而使得中介者对象可以管理对目标对象的访问。

 

突破题:请使用单词”操作“和”方法“来解释责任链模式是如何实现操作的?

答:责任链模式是在一个对象链上分发某个操作。每个对象的方法要么直接实现该方法的业务,要么将对该方法的调用转发到责任链上的下一个对象。

 

   方法声明包括方法头和方法体。方法体是可以通过调用返回方法签名完成动作的指令集合。方法头包含方法返回类型和签名,也许还包括修饰符以及异常抛出语句。方法头形式如下:

修饰符   返回类型  方法签名  throws子句

 

2.签名

 表面上,操作的含义与签名的含义很类似。两个词指的都是方法的接口。当编写方法时,遵循签名就可以调用之。

 

 方法签名包括方法名、形式参数和数目和类型。

 

 注意,方法签名不包括返回类型。但是,如果一个方法重写了另一个方法,而这两个方法的返回类型不同,那么在编译时会报错。

 

突破题:方法Bitmap.clone()返回Object对象,即使该方法始终返回Bitmap类的实例。请问如果返回类型被声明为Bitmap,代码会编译成功吗?

答:对于Java 5之前的版本:如果打算更改Bitmap.clone()的返回值,这部分代码不会编译成功。clone()签名会匹配Object.clone()的签名,所以返回类型也应该匹配。

     在Java 5中:Java 5语言定义已经修改为允许协变返回类型(covariant return type),子类可以声明更明确的返回类型。

 

     在客户端调用方法时,方法签名指明应该调用哪个方法。操作是可请求的服务的规范。术语签名和操作的含义很类似,但是名字本身并不同义。这两个术语的不同之处主要体现在所使用的上下文环境中。当研究不同类中的方法可能会有相同接口时,使用术语操作。当研究Java如何将一个方法调用映射到接收对象的方法时,使用术语签名。签名依赖于方法名和参数,但不依赖于返回类型。

 

3. 算法和多态性

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

   算法是定义良好的计算过程,把数据值或者数据集合作为输入,并输出某数据值或者数据集合。

 

   算法是个过程---包含一些指令序列,接受输入,产生输出。单个方法也许也是个算法:它接受输入---其参数列表---并产生输出作为返回值。然而,在面向对象编程时很多算法会需要多个方法。比如,Composite模式中的isTree()算法需要4个方法,如下图所示:

 
 

 4个isTree()方法一起实现一个算法,决定MachineComponent的某实例是否是树

 突破题:请问上面图中有多少算法、多少操作、多少方法?

答:上面图中有一个算法--该算法用于判断一个对象模型是否树结构,两个操作---出自MachineComponent类,四个方法。

 

在面向对象应用程序中,需要多个方法的算法经常依赖多态性来允许单个操作的多种实现。多态性是方法调用关于依赖被调用的操作和调用接收者类的基本原则。比如,你也许关心当Java遇到表达式isTree()时,会执行哪个方法。这关键看方法的依赖关系。如果m是Machine类的实例,Java会调用Machine.isTree()。如果m是MachineComposite的一个实例,Java会调用MachineComposite.isTree(),Java会调用Machine.isTree()。如果m是Machine类的实例,非正式地说,多态性意味着要为合适的对象调用合适的方法。很多设计模式都使用多态性,在某些情况下,多态性与该模式的目标紧紧相连。

 

4.小结

  操作、方法、签名和算法这四个概念很容易让人混淆。操作,类似于方法签名,定义了服务的规范。当谈到许多方法可能会有相同接口的时候,我们可以使用操作这个术语。当讨论方法查询规则的时候,我们可以使用签名这个术语。一个方法的定义包括方法签名、修饰符、返回类型以及方法体;而方法签名又包括方法名和参数列表。一个方法通常有一个方法签名,并实现一个操作。

 

  启动一个方法的常见方式是调用它。方法结束的常见方式是让它返回,但是对任何程序而言,当遇到不可处理的异常时,任何方法都会停止执行。

 

  一个算法的过程可能会涉及到很多的方法和操作,也可能仅仅是另外一个方法的一部分。算法这个术语最好谈到产生某个结果的过程时使用。

 

    很多设计模式都把一个操作分散到几个类中去。因而我们也可以说这些模式依赖于多态性,即具体调用哪个方法依赖于收到调用的对象的类型

 

 

6.超载普通操作

  不同的类可以用不同的方式来实现同一个操作。即Java语言支持多态性机制。下面的这几种设计模式都用到了多态性这一功能强大的机制。

如果你期望                                                                可应用模式

在一个方法中定义一个算法。把算法中某些步骤的定义推迟到子类中去重新定义

Template Method模式

各个类都实现一个操作,每个类代表一个不同的状态

State模式

封装一个操作,使其实现可以互相替换

Strategy模式

把方法调用封装在对象中

Command模式

各个类都实现一个操作,对每种不同的组合结构使用不同的操作实现

Interpreter模式

 

   面向操作的设计模式通常应用于下面的情景中:使用多个方法来完成一个设计,而这些方法具有相同的方法签名。例如,在Template Method模式中,子类实现的方法应该能够根据需要对其超类中定义的方法执行效果进行调整。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值