3.2 对象的状态和行为

前面,我们已经了解了类和对象的概念,下面我们针对对象来了解一下状态和行为的概念。对于一个对象来说,它有状态和行为两个特征。举个例子来说,一个椅子对象,它的高度、宽度等参数就是这个对象的状态;对于一辆汽车来说,车门可以打开、车子可以移动这些动作就是这个对象的行为。

从语言的语法角度来看,状态通常用名词来修饰,而行为通常用动词来修饰。

3.2.1 对象都有一组固定的行为

面向对象体现的一个核心价值是它可以简化操作。每个对象对外都暴露一组固定的行为,而这些固定的行为把复杂的实现隔开了。使用者只需要熟悉这个对象所提供的行为就可以熟练地操作(或者使用)对象。就拿电视机来说吧,它的“行为”就是开关电视,切换频道,我们只需要知道按哪个键可以开关电视,按哪个键可以换台就可以了,至于电视机怎么接通电信号,怎么切换频道,频道的电信号怎么转换为图像等这些复杂的工作全部由电视机这个对象为我们封装好了。

面向对象设计的难点之一就是定义一个对象的行为。我们要思考如何设计一组简洁的行为,而且还要有一定的灵活性。现在的工业设计都讲究人性化了,人性化的好处是能让用户使用更方便的同时而不需要花费太多的时间去学习如何使用。想想看,一个糟糕的设计,显示器的电源开关在显示器的背面,这种不方便的设计肯定会大大影响显示器的销量!没有人会接受这种用起来“受罪”的产品。

对于学习时间来说,简单的东西肯定比复杂的东西更容易上手。有20多个按钮的电视机遥控器使用起来很方便,因为它按钮比较少。如果电视机遥控器有200多个按钮,天哪,换个电视台简直就是受罪!当然,对于本来就不简单的东西来说,还是值得花点时间来学习一下的。

3.2.2 注意思维习惯

在为一个对象定义行为时,还应该注意的一点就是思维习惯。在日常生活中,我们已经习惯了很多规则,在马路上靠右行使、红灯指示停车、绿灯指示放行。这是大趋势、大潮流的运动方向,反其道而行多半没有什么好结果。巧妙地使用习惯思维来设计对象的行为,可以减少很多学习时间。因为人们在解决某一类问题时,已经建立了一套成熟的机制,每个人都在学习这套机制,所以当设计的行为与这套机制相似时,人们就会依照经验和直觉来使用这套行为。就像无论你使用哪个版本的Windows操作系统,你都知道可以从“开始”菜单中找到计算机安装的程序一样。

当对象的行为确定之后,对象就确定了它所能接收的请求。但是,在程序中一定要有满足这些请求的代码,这些代码和隐藏在类里的数据就构成了实现。在类中,每个可接受的请求都有一个方法与之对应,当向对象发送请求时,与该请求对应的方法就被调用。这个过程用一句话来说就是:向某个对象“发送消息”,对象在接收到这个消息指令后,执行对应的代码。

img

上面这个例子中,类的名称是String,为了创建一个String类的对象,我们首先声明一个String类型的变量str,然后使用new运算符来创建该类型的新对象,并将该对象的引用保存到str变量中。为了向对象发送消息,需要先创建对象的名称(这里就是变量str),然后使用点号(.)把对象名称与消息连接起来。对于这个例子来说,我们向str对象发送了一个length消息,这个消息的目的是获得该对象包含的字符总长度。