翻译对象的概念-服务

This commit is contained in:
LingCoder
2018-12-23 06:02:22 +08:00
parent d247646749
commit 963c2ce306
4 changed files with 47 additions and 9 deletions

View File

@@ -54,7 +54,7 @@
## 代码示
## 测试用
本书中的代码示例基于 Java 8和 Grade 编译构建,并且这些代码示例都保存在[这个自由访问的GitHub的仓库](https://github.com/BruceEckel/OnJava8-Examples) 中。我们需要内置的测试框架在每次构建系统时运行,否则你将无法保证自己代码的可靠性。为了在本书中实现这一点,我创建了一个测试系统来显示和验证大多数示例的输出结果。这个输结果我会附加在示例结尾的代码块中。有时仅显示必要的那几行或者首尾行。利用这种方式来改善读者的阅读和学习体验,同时也提供了一种验证示例正确性的方法。
@@ -66,7 +66,7 @@ Java 的普及性对于其受欢迎程度有重要意义。学习 Java 会让你
## 关于Andriod程序员
## 关于安卓
这本书基于 Java 8版本。如果你是 Andriod 程序员,请务必学习 Java 5。在《On Java 8》出版的时候我的另一本基于 Java 5的著作 Thinking in Java 4th Edition《Java编程思想》第四版已经可以在[www.OnJava8.com](http://www.OnJava8.com)上免费下载了。此外,还有许多其他专用于 Andriod 编程的资源。
@@ -117,7 +117,7 @@ Java 的普及性对于其受欢迎程度有重要意义。学习 Java 会让你
##
## 献
> 谨以此书献给我敬爱的父亲 E. Wayne Eckel。
> 1924年4月1日至2016年11月23日

View File

@@ -6,7 +6,7 @@
计算机革命的起源来自机器。编程语言就像是那台机器,它不仅是我们思维的放大工具和另一种表达媒介,更像我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
面向对象编程Object-oriented programming OOP是一种编程思维方式和编码架构。本章讲述 OOP 的基本概述。如果读者对不太理解,可先行跳过本章。等你对编程具有一定理解后,请务必再回过头来看。因为这样你才能理解面对对象编程的重要性以及如何使用它来设计你的程序。
面向对象编程(*Object-oriented programming OOP*)是一种编程思维方式和编码架构。本章讲述 OOP 的基本概述。如果读者对不太理解,可先行跳过本章。等你对编程具有一定理解后,请务必再回过头来看。因为这样你才能理解面对对象编程的重要性以及如何使用它来设计你的程序。
## 抽象
@@ -34,10 +34,48 @@ Grady Booch 提供了对对象更简洁的描述:一个对象具有自己的
## 接口
亚里士多德(*Aristotle*或许是认真研究“类型”概念的第一人他曾谈及“鱼类和鸟类”的问题。是世界首例面向对象语言Simula-67 中,第一次用到了这样的一个概念:
所有对象——尽管各有特色——都属于某一系列对象的一部分这些对象具有通用的特征和行为。在Simula-67 中首次用到了class 这个关键字它为程序引入了一个全新的类型class 和 type 通常可互换使用,有些人进行了进一步的区分,他们强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方式)。
Simula 是一个很好的例子。正如这个名字所暗示的它的作用是“模拟”Simulate象“银行出纳员”这
样的经典问题。在这个例子里,我们有一系列出纳员、客户、帐号以及交易等。每类成员(元素)都具有一
些通用的特征:每个帐号都有一定的余额;每名出纳都能接收客户的存款;等等。与此同时,每个成员都有
自己的状态;每个帐号都有不同的余额;每名出纳都有一个名字。所以在计算机程序中,能用独一无二的实
体分别表示出纳员、客户、帐号以及交易。这个实体便是“对象”,而且每个对象都隶属一个特定的“类”,那个类具有自己的通用特征与行为。
因此在面向对象的程序设计中尽管我们真正要做的是新建各种各样的数据“类型”Type但几乎所
有面向对象的程序设计语言都采用了“class”关键字。当您看到“type”这个字的时候请同时想到“class”反之亦然。
创建好一个类后,可根据情况生成许多对象。随后,可将那些对象作为要解决问题中存在的元素进行处理。事实上,当我们进行面向对象的程序设计时,面临的最大一项挑战性就是:如何在“问题空间”(问题实际存
在的地方)的元素与“方案空间”(对实际问题进行建模的地方,如计算机)的元素之间建立理想的“一对
一”的映射关系。
那么如何利用对象完成真正有用的工作呢必须有一种办法能向对象发出请求令其解决一些实际的问题比如完成一次交易、在屏幕上画一些东西或者打开一个开关等等。每个对象仅能接受特定的请求。我们向对象发出的请求是通过它的“接口”Interface定义的对象的“类型”或“类”则规定了它的接口形式。“类
型”与“接口”的对应关系是面向对象程序设计的基础。
下面让我们以电灯泡为例:
![reader](../images/reader.png)
```java
Light lt = new Light();
lt.on();
```
在这个例子中,类型/类的名称是 Light可向 Light 对象发出的请求包括包括打开on、关闭off、变得更明亮brighten或者变得更暗淡dim。通过简单地声明一个名字lt我们为 Light 对象创建了一个“句柄”。然后用new关键字新建类型为 Light 的一个对象。再用等号将其赋给句柄。
为了向对象发送一条消息我们列出句柄名lt再用一个句点符号.把它同消息名称on连接起来。从中可以看出使用一些预先定义好的类时我们在程序里采用的代码是非常简单和直观的。
上图遵循 UML*Unified Modeling Language*,统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分要描述的任何数据成员,以及方法(属于此对象的方法,它们接收任何发送到该对象的消息)在框的底部。通常,只有类的名称和公共方法在 UML 设计图中显示,因此中间部分未显示,如本例所示。如果您只对类名感兴趣,则也不需要显示方法信息。
## 方法
## 服务
在开发或理解程序设计时,考虑对象的一种很好的方式就是“服务提供者”。你的程序本身将为用户提供服务,并且它将通过调用其他对象提供的服务来实现这一点。您的目标是生成或引用现有代码库中的一些对象,提供理想的服务来解决您的问题。
那么问题来了:“当我可以随时调用这些方法时,我该选择哪个来解决我的问题呢?”例如,假设你正在开发一个记事本程序。您可能会想在屏幕输入一个预定义的记事本对象,一个用于检测不同类型打印机并执行打印的对象。也许这些对象中的部分已存在。那么对于那些没有的对象,他们应该会是什么样子呢?这些对象提供哪些服务,以及履行其义务需要哪些对象?
分解问题的良好方式是将其抽象成一组方法。高内聚是软件设计的基本原则:每个组件各自的作用清晰集中。经常有人将太多功能塞进一个对象中。例如,在支票打印模块中,你可能需要一个同时读取格式又能打印种类的对象。正确的做法是提供三个或更多对象。一个对象检查所有布局的目录;一个对象或一组对象可以是一个通用的打印界面,它知道所有不同类型的打印机;第三个对象使用其他两个服务来完成任务。因此,每个对象都提供了一组紧密的服务。在良好的面向对象设计中,每个对象功能单一,效果显著。这样可以提高代码的复用性。将对象作为服务提供者处理不仅有利于我们的程序设计,同时也方便别人阅读和理解我们的代码。只有先让人知道你提供什么服务,别人才有可能将其应用到其他程序色设计中。
## 封装