第1部分 面向对象编程初级篇 3
第1章 面向过程和面向对象程序设计 3
1.1 什么是面向过程的编程 3
1.2 什么是面向对象的编程 4
1.2.1 什么是对象(Object) 4
1.2.2 什么是类(Class) 4
1.2.3 什么是统一建模语言(UML) 6
1.3 面向过程编程有哪些局限性 9
1.4 面向对象编程有哪些优点 12
第2章 MATLAB面向对象程序入门 15
2.1 如何定义一个类 15
2.2 如何创建一个对象 16
2.3 类的属性(Property) 18
2.3.1 如何访问对象的属性 18
2.3.2 什么是属性的默认值(Default Value) 18
2.3.3 什么是常量(Constant)属性 19
2.3.4 什么是非独立(Dependent)属性 20
2.3.5 什么是隐藏(Hidden)属性 23
2.4 类的方法(Method) 24
2.4.1 如何定义类的方法 24
2.4.2 如何调用类的方法 26
2.4.3 点调用和函数式调用类方法的区别 27
2.4.4 什么是方法的签名 27
2.4.5 类、对象、属性、方法之间的关系 30
2.4.6 如何用disp方法定制对象的显示 30
2.5 类的构造函数(Constructor) 33
2.5.1 什么是Constructor 33
2.5.2 如何在Constructor中给property赋值 33
2.5.3 如何让Constructor接受不同数目的参数 34
2.5.4 什么是Default Constructor 35
2.5.5 用户一定要定义Constnuctor吗 36
2.6 类的继承 37
2.6.1 什么是继承 37
2.6.2 为什么子类Constructor需要先调用父类Constructor 41
2.6.3 在子类方法中如何调用父类同名方法 43
2.6.4 什么是多态 44
2.7 类之间的基本关系:继承、组合和聚集 45
2.7.1 如何判断B能否继承A 45
2.7.2 企鹅和鸟之间是不是继承关系 45
2.7.3 如何把类组合起来 46
2.7.4 什么是组合聚集关系 48
2.8 Handle类的set和get方法 50
2.8.1 什么是set方法 50
2.8.2 什么是get方法 51
2.9 如何设置属性和方法的访问权限 53
2.9.1 什么是public,protected,private权限 53
2.9.2 如何决定对类的属性和方法设置何种访问权限 56
2.9.3 MATLAB对属性访问的控制与C++和Java有什么不同 57
2.10 Clear Classes到底清除了什么 58
第3章 MATLAB的句柄类和实体值类 60
3.1 引子:参数是如何传递到函数空间中去的 60
3.2 MATLAB的Value Class和Handle Class 64
3.2.1 什么是Value Class和Handle Class 64
3.2.2 Value类对象和Handle类对象拷贝有什么区别 66
3.2.3 Value类对象和Handle类对象赋值有什么区别 66
3.2.4 Value类对象和Handle类对象当做函数参数有什么区别 69
3.2.5 什么情况下使用Value类或Handle类 71
3.3 类的析构函数(Destructor) 76
3.3.1 什么是对象的生存周期 76
3.3.2 什么是析构函数(Destructor) 76
3.3.3 对Object使用clear会发生什么 77
3.3.4 对Object使用delete会发生什么 78
3.3.5 什么情况下delete方法会被自动调用 80
3.3.6 出现异常时delete函数如何被调用 83
3.3.7 何时用户需要自己定义一个delete方法 85
第4章 事件和响应 87
4.1 事件(Event) 87
4.1.1 什么是事件 87
4.1.2 如何定义事件和监听事件 88
4.1.3 为什么需要事件机制 89
4.2 发布者通知观察者对象,但不传递消息 90
4.3 发布者通知观察者,并且传递消息 91
4.4 删除listener 94
第5章 MATLAB类文件的组织结构 95
5.1 如何使用其他文件夹中的类的定义 95
5.2 如何把类的定义和成员方法的定义分开 96
5.3 如何定义类的局部函数 97
5.4 如何使用Package文件夹管理类 98
5.4.1 Package中的类是如何组织的 98
5.4.2 如何使用Package中的某个类 100
5.4.3 如何导入Package中的所有类 100
5.5 函数和类方法重名到底调用谁 100
5.6 Package中的函数和当前路径上的同名函数谁有优先级 101
第6章 MATLAB对象的保存和载入 102
6.1 save和load命令 102
6.1.1 如何save和load object 102
6.1.2 MAT文件中保存了object中的哪些内容 102
6.1.3 如果类的定义在save之后发生了变化 105
6.2 saveobj和loadobj方法 108
6.2.1 如何定义saveobj方法 108
6.2.2 如何定义loadobj方法 109
6.3 继承情况下的saveobj和loadobj方法 110
6.3.1 存在继承时如何设计saveobj方法 110
6.3.2 存在继承时如何设计loadobj方法 111
6.4 什么是瞬态(Transient)属性 113
6.5 什么是装载时构造(ConstructOnLoad) 114
第7章 面向对象的GUI编程:分离用户界面和模型 116
7.1 如何使用GUIDE进行GUI编程 116
7.2 如何使用程序的方式(Programmatic)进行GUI编程 118
7.3 如何用面向对象的方式进行GUI编程 121
7.4 模型类中应该包括什么 122
7.5 视图类中应该包括什么 124
7.6 控制器类中应该包括什么 126
7.7 如何把Model、View和Controller结合起来 127
7.8 如何设计多视图的GUI以及共享数据 130
7.9 如何设计GUI逻辑架构 135
7.10 如何使用GUI Layout Toolbox对界面自动布局 138
7.10.1 为什么需要布局管理器 138
7.10.2 纵向布局类VBox 140
7.10.3 横向布局类HBox 141
7.10.4 选项卡布局TabPanel 142
7.10.5 网格布局类Grid 143
7.10.6 GUI Layout的复合布局 144
7.10.7 把GUI Layout Toolbox和MVC模式结合起来 145
第2部分 面向对象编程中级篇 149
第8章 类的继承进阶 149
8.1 继承情况下的Constrctor和Destructor 149
8.1.1 什么情况需要手动调用基类的Constructor 149
8.1.2 什么情况可以让MATLAB自动调用基类的Constructor 150
8.1.3 常见错误:没有提供缺省构造函数 151
8.1.4 在Constructor中调用哪个成员方法 152
8.1.5 析构函数被调用的顺序是什么 154
8.2 MATLAB的多重继承 155
8.2.1 什么情况下需要多重继承 155
8.2.2 什么是多重继承 156
8.2.3 构造函数被调用的顺序是什么 157
8.2.4 多重继承如何处理属性重名 158
8.2.5 多重继承如何处理方法重名 159
8.2.6 什么是钻石型继承 160
8.2.7 如何同时继承Value类和Handle类 163
8.3 如何禁止类被继承 165
第9章 类的成员方法进阶 166
9.1 Derived类和Base类同名方法之间有哪几种关系 166
9.1.1 Derived的方法覆盖Base的方法 166
9.1.2 Derived的方法可以扩充Base的同名方法 166
9.1.3 Base的方法可以禁止被Derived重写 167
9.2 什么是静态(Static)方法 168
9.3 同一个类的各个对象如何共享变量 170
9.3.1 什么情况下各个对象需要共享变量 170
9.3.2 如何共享常量属性 170
9.3.3 如何共享变量 171
第10章 抽象类 173
10.1 什么是抽象类(Abstract)和抽象方法 173
10.2 为什么需要抽象类 174
10.3 如何使用抽象类 175
10.3.1 抽象类不能直接用来声明对象 175
10.3.2 子类要实现所有抽象方法 176
第11章 对象数组 178
11.1 如何把对象串接成数组 178
11.2 如何直接声明对象数组 179
11.3 如何使用findobi寻找特定的对象 182
11.4 如何利用Cell array把不同类的对象组合到一起 184
11.5 什么是转换函数 186
11.6 如何利用转换函数把不同类的对象组合到一起 187
11.7 如何用非同类(Heterogeneous)数组盛放不同类对象 188
11.7.1 为什么需要Heterogeneous数组 188
11.7.2 含有不同类对象的数组类型 190
11.7.3 使用Heterogeneous要避免哪些情况 191
11.7.4 如何向量化遍历数组中对象的属性 192
11.7.5 如何设计成员方法使其支持向量化遍历 193
第12章 类的运算符重载 195
12.1 理解MATLAB的subsref和subsasgn函数 195
12.1.1 MATLAB如何处理形如a(1,:)的表达式 195
12.1.2 MATLAB如何处理形如a{1,:}的表达式 196
12.1.3 MATLAB如何处理形如s.f的表达式 197
12.2 如何重载subsref函数 198
12.3 如何重载subsasgn函数 199
12.4 什么情况下重载下标运算符 200
12.5 如何重载plus函数 200
12.6 MATLAB的Dispatching规则是什么 202
12.7 如何判断两个对象是否相同 203
12.8 如何让一个对象在行为上像一个函数 204
12.9 MATLAB中哪些算符允许重载 207
第13章 超类 209
13.1 什么是超类(Meta Class) 209
13.2 如何获得一个类的meta.class对象 210
13.3 meta.class对象中有些什么内容 211
13.4 如何手动克隆一个对象 213
13.5 如何使用matlab.mixin.Copyable自动克隆一个对象 218
第3部分 设计模式篇 225
第14章 面向对象程序设计的基本思想 225
14.1 单一职责原则 226
14.2 开放与封闭原则 227
14.3 多用组合少用继承 229
14.4 面向接口编程 231
第15章 创建型模式 236
15.1 工厂模式:构造不同种类的面条 236
15.1.1 简单工厂模式 236
15.1.2 工厂模式 240
15.1.3 Factory模式总结 242
15.1.4 如何进一步去掉switch/if语句 243
15.1.5 抽象工厂 244
15.1.6 Abstract Factory模式总结 247
15.2 单例模式:给工程计算添加一个LOG文件 247
15.2.1 如何控制对象的数量 247
15.2.2 应用:如何包装一个对象供全局使用 250
15.3 建造者模式:如何用MATLAB构造一辆自行车 252
15.3.1 问题的提出 252
15.3.2 用:Builder模式为大规模计算做准备工作 256
15.3.3 Builder模式总结 257
第16章 构造型模式 261
16.1 装饰者模式:动态地给对象添加额外的职责 261
16.1.1 装饰者模式的引入 261
16.1.2 面馆菜单代码 263
16.1.3 装饰者模式总结 265
第17章 行为模式 267
17.1 观察者模式:用MATLAB实现观察者模式 267
17.1.1 发布和订阅的基本模型 267
17.1.2 订阅者查询发布者的状态 270
17.1.3 把发布者和订阅者抽象出来 271
17.1.4 Observer模式总结 272
17.2 策略模式:分离图像数据和图像处理算法 275
17.2.1 问题的提出 275
17.2.2 应用:更复杂的分离数据和算法的例子 279
17.2.3 Strategy模式总结 280
17.3 遍历者模式:工程科学计算中如何遍历大量数据 281
17.3.1 问题的提出 281
17.3.2 聚集(Aggregator)和遍历者(Iterator) 283
17.3.3 Iterator模式总结 286
17.4 状态模式:用MATLAB模拟自动贩卖机 287
17.4.1 使用if语句的自动贩卖机 288
17.4.2 使用State Pattern的自动贩卖机 293
17.4.3 State模式总结 298
17.5 模板模式:下面条和煮水饺有什么共同之处 300
17.5.1 抽象下面条和煮水饺的过程 300
17.5.2 应用:把策略和模板模式结合起来 304
17.5.3 Template模式总结 304
17.6 备忘录模式:实现GUI的UNDO功能 306
17.6.1 如何记录对象的内部状态 306
17.6.2 应用:如何利用备忘录模式实现GUI的do和undo操作 309
17.6.3 Memento模式总结 314
参考文献 315
附录 319
附录A 如何在MATLAB IDE中切换窗口 319
附录B 综合实例:如何把面向过程的程序转成面向对象的程序 321
索引 332