面向对象导论

导读

  1. 面向过程、面向对象是什么、它们的优缺点、使用场景
  2. 类、对象、抽象类、接口
  3. 封装、继承、多态

面向对象概述

面向过程

定义:一种以“过程”作为中心的编程思想,其中过程的含义就是“完成一件事的步骤”。

特点流水线编程思想机器思维),流水线一个阶段衔接另一个阶段,每个阶段都有自己的输入、处理、输出,而在流水线上流动就是原料或中间产品,每个阶段都有机械处理,最后输出产品。

面向过程程序流水线 = 程序划分不同阶段+ 衔接规则+ 各阶段的处理数据

面向过程程序 =算法+ 数据结构(算法 = 流水线,数据结构 = 原料/中间产品,程序 = 产品)

为什么面向过程是流水线式?

面向过程的发明是参照流水线模式,而机器思维指的是流水线机器做事的方式。

答:计算机本质是一台机器,其核心CPU处理的是指令流水(一整个执行流程有序指令集)。

在这里插入图片描述

面向对象

定义:面向对象是一种以“对象”作为中心的编程思想,其中对象的含义可以理解为“存在的东西”。

特点:人的思想(以人的思维观察、分析、设计系统),更侧重于对现实世界的模拟;设计了很多对象,指定了这些对象需要完成的任务。

面向对象程序= 对象+ 交互

对象是具体存在的事物,交互则是对象之间的作用、互动

为什么要面向对象

如:啤酒的生产线不能用于生产醋,如果改装成生产醋,则又不能生产啤酒。

面向过程:扩展性差,适合比较稳定变化少的业务(计算机系统)。

面向对象:核心是“可扩展性”,经常变化的地方就应用面向对象(用户需求)。

软件质量属性图

质量属性:衡量软件质量优劣的参考属性点

面向过程 & 面向对象

面向过程面向对象
应用业务稳定、变化少经常变化、不断扩展、快速响应
核心特点流程化可扩展性
编程思维机器思维人的思维
编程特性程序 = 算法 + 数据结构程序 = 对象 + 交互
编程语言CJava、C++

*对于复杂业务系统,性能的好坏是由设计来决定,而不是语言来决定。

面向对象语言 != 面向对象编程

面向对象和面向过程都是一种编程思维,一种思考问题的方式,和具体语言无关。C语言可以进行面向对象开发,Java同样可以进行面向过程开发。

面向对象理论

定义:类是一组相似事物的统称

一组:多个,单个事物无法成为类

相似:比较像,但不完全相同(牛、羊都吃草都是哺乳动物,但他们不是完全相同)

统称:概括这多个事物(猫、狗、猪、牛统称动物)

如何定义(划分)类

有相似点的事物就是同一类

  • 我和你是不是一类(都是人)

  • 你和猪是不是一类(都是哺乳动物)

  • 你和松树是不是一类(都是生物)

站在你观察角度,具有相似点的事物就是同一类。万法归一,所有的事物都可以归为一类(Java中的Class),但只有一个类无法满足要求,实际应用需要多种多样的类。

面向对象类

面向对象类由属性和方法组成

属性:类具有的特性(人:头发、耳朵)

方法:类具有的功能(人:说话、走路)

实际编码时,将名词作为属性,动词作为功能进行属性和方法划分。

属性设计原则属性最小化原则,即不可再分(省市区,可以作为一个地址属性,也可分为三个属性)。

方法设计原则单一职责原则,即“一个方法只做一件事”。

对象

对象是类的一个具体存在的事物。如:我是一个人的对象

问题:为什么有类还要有对象,它们的作用是什么?

答:现实中的类是人类出现文明后对现实事物的总结归纳,编程的类是程序员分析归纳总结的。无论是现实还是程序中,交互的都是对象,而且交互是跨类。

问题:现有类还是先有对象?

现实对象:能看到的物体都可以叫对象

现实类:对现实对象的归纳总结

软件对象:软件实际运行过程中的对象

软件类:软件设计过程中归纳总结出来的类

软件类来源于现实类,但高于现实类,是对现实类的抽象和扩展

如:领料类、补货类,现实中是一个功能

接口

接口定义:接口是一组相关交互功能点定义的集合

相关:接口中的功能点事相关的,并非杂乱放在一起的

交互:接口是用于不同对象之间交互的,如果只是自己玩的不能定义为接口

定义:功能点都只是定义,并没有具体实现功能(定义了标准规范,如:参数、实现功能、返回值等),如:笔记本定义了各种接口(HDMI、USB、Type-C,但是具体的功能由其他厂商实现)

集合:多个功能点的集合

public interface IAnimal {
  /**
  * Java的interface很好体现了我们前面分析的接口特征:
  * 1. 是一组功能的集合
  * 2. 接口的功能是用于不同对象交互,所有接口都是public,其他对象可调用
  * 3. 接口只定义了函数,没有具体功能实现
  * 4. 功能都是相关的,都是动物相关的功能,不相关的功能不能放在IAnimal里面
  */
  public void eat();
  public void run();
  public void sleep();
  public void speak();
}

接口只是对一类事物属性和行为的更高次抽象;对修改关闭对扩展开放,可以说是java中开闭原则的一种体现。

抽象类

抽象类:特殊的类,只能用于继承不能被实例化具体对象,包含抽象方法和普通方法。

问题:有了类为什么还要抽象类?为什么设计一种只能继承不能被实例化的类?

答:普通类在某些场景下不够用,如:买宠物,可以是猫、狗、蛇、猪等,但买不到具体的叫宠物的东西。

问题:接口和抽象类的区别?

答:抽象类本质还是类,是一组事物的相似性,包含属性和方法,而接口强调一组方法的相似性,且方法只有定义。

普通类由现实类抽象而来,抽象类是基于类的更高一层的抽象,抽象类介于普通类和接口之间。

抽象类作用:封装相似的属性和功能,使得复杂或共同的功能得以隐藏。

抽象

抽取比较像的部分,如:将类中相似的功能逻辑抽象出来可组成抽象类

上图分为两个层次抽象:

第一层次:将属性类似的对象抽象为类

第二层次:将行为类似的类抽象为超类(父类或更高一层的类)

父类或更高层的类是包含相似的行为的类(子类)的一个抽象,抽象的层次不限,可根据业务需要或不同的观察角度抽出更多层。

抽象的作用:划分类别(分类的目的是隔离关注点,降低复杂度),面向对象中通过抽象方式可从不同角度发现类。

三大核心特征

面向对象三大核心特征:封装、继承、多态,判断一种编程语言是否为面向对象语言,就看其是否支持这三大核心特征。

封装

问题:要封装什么?

答:封装是类的功能(封装具体在类中实现),可以对属性或者方法进行封装。

问题:为什么要封装?

答:保护隐私隔离复杂度

面向对象对类属性封装后,对属性的访问只能通过方法进行,这样还统一类属性的操作(保护隐私)。

面向对象对类方法封装后,隔离了复杂度,每个方法只需要关注自己的功能实现,如果需要其他类配合,直接调用其他类方法即可。

例1:面向过程无封装,程序 = 算法 + 数据结构,数据结构完全公开

Person.h
typedef struct Person{
  char * name; //姓名
  int money;   //金钱数量
}Person;

money.c
int main(void) {
  Person*me = (Person)malloc(sizeof(Person));
  me -> name = "华仔";
  me -> money = 1000;
  
  //收银员收银
  if(me -> money > 50) {
    me -> money -= 50;
  } else {
    printf("%s 付款失败\n", me -> name);
  }
  
  //小偷偷钱,小偷可直接操作Person的money
  me -> money = 0;
  free(me);
  
  return EXIT_SUCCESS;
}

//有多少钱导出炫耀

例2:面向对象 = 对象 + 交互

public class Person {
	private String _name;  //姓名
  private int _money;   //金钱
  
  public String getName() {
    return _name;
  }
  
  public boolean pay(int money) {
    if(money > _money) {
      return false;
    } 
    
    _money = money;
    return true;
  }
}

//钱多少只有自己知道
封装的三种形式

public:不封装,对外公开

protected:对外不公开,但对子类公开

private: 对谁都不公开

继承

定义:继承 = 遗传,子类遗传了父类的属性和方法

生物学进化论,遗传会产生变异,而面向对象中,继承同样通过变异产生子类,同时自类会产生自己的新特性(属性/方法)。

抽象是分析和设计过程的一个动作、一个技巧、通过抽象得出类。

继承是实现过程的动作,基于抽象的结果,完成对抽象图的模拟。

多态

polymorphism

问题1:重载和重写是否属于多态的特性?

问题2:什么是多态?

定义:父类的指针或者引用,可以调用子类的对象(父类引用指向子类对象)

public abstract class Animal {
  abstract String talk();
}

public class Dog extends Animal{
  
  @Override
  String talk() {
    return "Dog ... wangwang.":
  }
}

public class Pig extends Animal{
  
  @Override
  String talk() {
    return "Pig ... ao ao.":
  }
}

public class Cat extends Animal{
  
  @Override
  String talk() {
    return "Cat ... miao miao.":
  }
}

public class Test1{
  
  public static void main(String[] args) {
    Animal aninal = new Dog();
    System.out.println(new Dog().talk());
    System.out.println(new Pig().talk());
    System.out.println(new Cat().talk());
  }
}

作用屏蔽差异应变。屏蔽子类对象的差异、以不变应万变(新增子类无需修改)

面向对象总结

在这里插入图片描述

【参考文献】

  • 李运华著《编程的逻辑-如何运用面向对象方法实现复杂业务需求》
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。   本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业面向对象课程的理想教学参考书。 第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象开发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 1.4 类到底是什么 9 1.4.1 类是对象模板 9 1.4.2 属性 11 1.4.3 方法 11 1.4.4 消息 11 1.5 使用UML完成类图建模 12 1.6 封装和数据隐藏 12 1.6.1 接口 12 1.6.2 实现 13 1.6.3 接口/实现范型的一个实际例子 13 1.6.4 接口/实现范型的模型 14 1.7 继承 15 1.7.1 超类和子类 16 1.7.2 抽象 16 1.7.3 is-a关系 17 1.8 多态 18 1.9 组合 20 1.9.1 抽象 21 1.9.2 has-a关系 21 1.10 小结 21 1.11 本章使用的示例代码 21 1.11.1 TestPerson示例:C#.NET 21 1.11.2 TestPerson示例:VB.NET 22 1.11.3 TestShape示例:C#.NET 23 1.11.4 TestShape示例:VB.NET 25 第2章 如何以对象方式思考 27 2.1 了解接口与实现之间的区别 28 2.1.1 接口 29 2.1.2 实现 29 2.1.3 接口/实现示例 29 2.2 设计接口时使用抽象思维 33 2.3 尽可能为用户提供最小接口 35 2.3.1 确定用户 35 2.3.2 对象行为 36 2.3.3 环境约束 36 2.3.4 明确公共接口 36 2.3.5 明确实现 37 2.4 小结 37 2.5 参考书目 38 第3章 高级面向对象概念 39 3.1 构造函数 39 3.1.1 何时调用构造函数 39 3.1.2 构造函数中有什么 40 3.1.3 默认构造函数 40 3.1.4 使用多个构造函数 41 3.1.5 构造函数的设计 44 3.2 错误处理 44 3.2.1 忽略问题 45 3.2.2 检查问题并中止应用 45 3.2.3 检查问题并尝试恢复 45 3.2.4 抛出异常 45 3.3 作用域概念 47 3.3.1 局部属性 48 3.3.2 对象属性 49 3.3.3 类属性 50 3.4 操作符重载 51 3.5 多重继承 52 3.6 对象操作 53 3.7 小结 54 3.8 参考书目 54 3.9 本章使用的示例代码 54 3.9.1 TestNumber示例:C#.NET 54 3.9.2 TestNumber示例:VB.NET 55 第4章 类剖析 57 4.1 类名 57 4.2 注释 58 4.3 属性 59 4.4 构造函数 60 4.5 访问方法 62 4.6 公共接口方法 63 4.7 私有实现方法 64 4.8 小结 64 4.9 参考书目 64 4.10 本章使用的示例代码 65 4.10.1 TestCab示例:C#.NET 65 4.10.2 TestCab示例:VB.NET 66 第5章 类设计指导原则 68 5.1 真实世界系统建模 68 5.2 明确公共接口 69 5.2.1 最小公共接口 69 5.2.2 隐藏实现 69 5.3 设计健壮的构造函数(和析构函数) 70 5.4 在类中设计错误处理 70 5.4.1 对类建立文档以及使用注释 71 5.4.2 构建类要以合作为出发 71 5.5 设计时充分考虑重用 72 5.6 设计时充分考虑到可扩展性 72 5.6.1 名字要有描述性 72 5.6.2 抽出不可移植的代码 72 5.6.3 提供一种复制和比较对象的方法 73 5.6.4 让作用域尽可能小 73 5.6.5 类应当对自己负责 74 5.7 设计时充分考虑可维护性 75 5.7.1 使用迭代 76 5.7.2 测试接口 76 5.8 使用对象持久性 78 5.9 小结 79 5.10 参考书目 79 5.11 本章使用的示例代码 79 5.11.1 TestMath示例:C#.NET 79 5.11.2 TestMath示例:VB.NET 80 第6章 利用对象实现设计 81 6.1 设计指导原则 81 6.1.1 完成适当的分析 84 6.1.2 建立工作陈述 84 6.1.3 收集需求 84 6.1.4 开发用户界面的原型 85 6.1.5 明确类 85 6.1.6 确定各个类的职责 85 6.1.7 确定类如何相互合作 85 6.1.8 创建类模型来描述系统 85 6.2 案例研究:blackjack示例 86 6.2.1 使用CRC卡 87 6.2.2 明确blackjack类 88 6.2.3 明确类的职责 90 6.2.4 UML用例:明确协作关系 95 6.2.5 第一轮CRC卡 98 6.2.6 UML类图:对象模型 99 6.2.7 建立用户界面原型 100 6.3 小结 101 6.4 参考书目 101 第7章 掌握继承和组合 102 7.1 重用对象 102 7.2 继承 103 7.2.1 一般化和特殊化 105 7.2.2 设计决策 105 7.3 组合 107 7.4 为什么封装在OO中如此重要 109 7.4.1 继承如何削弱封装 109 7.4.2 多态的一个详细例子 111 7.4.3 对象职责 111 7.5 小结 115 7.6 参考书目 115 7.7 本章使用的示例代码 115 7.7.1 TestShape示例:C#.NET 115 7.7.2 TestShape示例:VB.NET 117 第8章 框架与重用:使用接口和抽象类实现设计 119 8.1 代码:重用还是不重用 119 8.2 什么是框架 119 8.3 什么是契约 121 8.3.1 抽象类 122 8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 建立契约 128 8.3.6 系统插入 130 8.4 一个电子商务例子 130 8.4.1 电子商务问题 130 8.4.2 非重用的方法 131 8.4.3 一个电子商务解决方案 133 8.4.4 UML对象模型 133 8.5 小结 137 8.6 参考书目 137 8.7 本章使用的示例代码 138 8.7.1 TestShape示例:C#.NET 138 8.7.2 TestShape示例:VB.NET 140 第9章 构建对象 143 9.1 组合关系 143 9.2 分阶段构建 144 9.3 不同类型的组合 146 9.3.1 聚集 146 9.3.2 关联 146 9.3.3 结合使用关联和聚集 148 9.4 避免依赖性 148 9.5 基数 149 9.5.1 多个对象关联 151 9.5.2 可选关联 151 9.6 集成示例 152 9.7 小结 152 9.8 参考书目 153 第10章 用UML创建对象模型 154 10.1 什么是UML 154 10.2 类图的结构 155 10.3 属性和方法 156 10.3.1 属性 156 10.3.2 方法 157 10.4 访问指示 157 10.5 继承 158 10.6 接口 159 10.7 组合 160 10.7.1 聚集 160 10.7.2 关联 161 10.8 基数 161 10.9 小结 162 10.10 参考书目 163 第11章 对象和可移植数据:XML 164 11.1 可移植数据 164 11.2 XML 165 11.3 XML与HTML 166 11.4 XML和面向对象语言 166 11.5 两个公司间共享数据 167 11.6 用DTD验证文档 168 11.7 将DTD集成到XML文档 170 11.8 使用层叠样式表 175 11.9 小结 177 11.10 参考书目 177 第12章 持久对象:串行化和关系数据库 178 12.1 持久对象基础 178 12.2 将对象保存到平面文件 179 12.2.1 串行化文件 180 12.2.2 再谈实现和接口 182 12.2.3 方法如何保存 183 12.3 串行化过程中使用XML 183 12.4 写到关系数据库 186 12.5 加载驱动程序 189 12.5.1 建立连接 189 12.5.2 SQL语句 190 12.6 小结 192 12.7 参考书目 192 12.8 本章使用的示例代码 192 12.8.1 Person类示例:C#.NET 193 12.8.2 Person类示例:VB.NET 195 第13章 对象与因特网 197 13.1 分布式计算的演进 197 13.2 基于对象的脚本语言 197 13.3 JavaScript验证示例 200 13.4 Web页面中的对象 202 13.4.1 JavaScript对象 202 13.4.2 Web页面控件 204 13.4.3 声音播放器 205 13.4.4 电影播放器 205 13.4.5 Flash 206 13.5 分布式对象和企业 206 13.5.1 公共对象请求代理体系结构(CORBA) 207 13.5.2 Web服务定义 210 13.5.3 Web服务代码 213 13.5.4 Invoice.cs 214 13.5.5 Invoice.vb 215 13.6 小结 216 13.7 参考书目 216 第14章 对象和客户/服务器应用 217 14.1 客户/服务器方法 217 14.2 专有方法 217 14.2.1 串行化对象代码 218 14.2.2 客户代码 218 14.2.3 服务器代码 220 14.2.4 运行专有的客户/服务器示例 222 14.3 非专有方法 223 14.3.1 对象定义代码 223 14.3.2 客户代码 224 14.3.3 服务器代码 225 14.3.4 运行非专有的客户/服务器示例 227 14.4 小结 228 14.5 参考书目 228 14.6 本章使用的示例代码 228 14.6.1 客户/服务器示例——VB.NET:对象定义代码 228 14.6.2 客户/服务器示例——VB.NET:客户代码 229 14.6.3 客户/服务器示例——VB.NET:服务器代码 230 第15章 设计模式 232 15.1 为什么研究设计模式 232 15.2 Smalltalk的模型/视图/控制器 233 15.3 设计模式的不同类型 234 15.3.1 创建型模式 235 15.3.2 结构型模式 239 15.3.3 行为型模式 241 15.4 反模式 242 15.5 小结 243 15.6 参考书目 243 15.7 本章使用的示例代码 243 15.7.1 C#.NET 244 15.7.2 VB.NET 247 索引 250
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值