Java - 闭包
- 概述
- 简单介绍 闭包
1. 聚合关系
-
概述
- 常见的 类间关系
-
场景
-
类 A
- 主要类
- 持有 类B 的实例
- 有点行为, 需要 类 B 的介入
-
类 B
- 有自己的行为
- A 会在某些时候调用 B 的行为
-
-
代码示例
-
伪代码
class B: public void method1(): actions; class A: private B b; public A(B b): this.b = b; public void m1(): this.b.method1();
-
代码
- 伪代码有点坑
- 代码的话, 有机会会做补充
-
2. 换一个角度
-
概述
- 闭包
-
闭包
- 可以调用的对象
- 包含了作用域的信息
- 这玩意也不是什么类间关系
- 为啥把它和 聚合 放一块
-
场景
-
类 A
- 单一类
- 持有 类B 的实例
-
类 B
- 是 类A 的属性
- 是 A 的 内部类
- 实现了 接口I
-
接口I
- 被 B 实现
- 作为 引用对象, 接收 B 类实例
-
-
示例
-
伪代码
interface I: void method1(); class A: class B implements I: public void method1(): A.this.method1(); public void method1(): actions public I getCallbackRef(): return new B();
-
代码
- 有空再补
-
-
tips
-
内部类
- 内部类持有 外部类 的一个引用
- 通过 OuterClass.this 来获取
- 内部类持有 外部类 的一个引用
-
getCallBackRef
-
返回一个 I 类型的对象
- 实现方法
- 方便外面接收实例
-
实际返回的, 是 内部类 的实例
-
-
内部类的 method1
-
来自 I 的实现
-
实际行为
- 需要靠 A 来执行
-
-
然后一个类比
-
模型
- 类A 持有 类B
- 类A 的行为, 由 类B 来执行
-
聚合
- 符合这个模型
-
闭包
- 内部类的角度, 也符合这个模型
- 当然有点别扭
- 别扭的是, 内部类持有了 外部类 的引用
- 其实, 这个也不用奇怪
- 内部类 外部类 的关系, 和 聚合关系, 并没有直接的 可比性
- 当然, 只是相似
- 一个持有另一个
-
-
闭包
- 行为
- 得到一个 接口I 类型, 但实际为 内部类 的对象
- 当然, 这个接口, 也可以换成 抽象类
- 这个对象, 持有创建它的外部类
- 可以通过它, 暴露一些外部类的方法, 属性
- 可以通过这个持有, 保持外部类不被垃圾回收
- 得到一个 接口I 类型, 但实际为 内部类 的对象
- 行为
-
3. 好了, 那闭包到底有什么用
- 多重继承
-
java 的继承
- 正常情况下, 只能继承一个类
- 接口实现多个, 这个另说
-
多重继承
-
也不是真正意义上的多重继承
-
思路
-
约定
- 类 Outer
- 外部类
- 类 Inner
- 内部类
- 类 Abs1
- 抽象类1
- 类 Abs2
- 抽象类2
- 类 Outer
-
场景
- Outer 继承 Abs1
- Inner 继承 Abs2
- Inner 实现 Abs2 方法
- 实现的时候, 可以引入 Outer 对象来做操作
- 虽然不是真正的多重继承, 但实质上已经可以这么认为
- Outer 实现方法, 返回 Abs2 类型的对象
- 实际返回 Inner 类型的实例
- 其他使用者, 用 Abs2 类型的引用, 来接住这个实例
-
-
-
ps
-
类间关系
- ref
- 关于 依赖 与 聚合
-
约定
- 类 A
- 主体类
- 类 B
- 被依赖
- 被聚合
- 类 A
-
依赖
- 重点
- A 的方法, 需要 B 来做参数
- 可能导致的结果, A 的行为, 会受到 B 影响
- A 的方法, 需要 B 来做参数
- 重点
-
聚合
- 重点
- A 的属性, 是 B
- 可能导致的结果, A 的行为, 会受到 B 影响
- 怎么和上面一样...
- 可能导致的结果, A 的行为, 会受到 B 影响
- A 的属性, 是 B
- 重点
-
区别
- 依赖
- 强调的关系, 没有聚合那么紧密
- 临时产生一个交集
- 交互完了关系立马消失
- 聚合
- 关系相对紧密, 整体 与 部分 的关系
- 关系较为稳定
- 整体存在, 关系一直都存在
- 依赖
-
-
内部类
- 这块暂时不细说
- Java 编程思想里, 有一章专门对这块做了详细的介绍
- 这块暂时不细说
-
其他
-
类间关系, UML
- 这块其实, 还是挺有用的
-
js 闭包
- 我第一见到闭包, 其实是 js
- 但是至今没有理解
-
伪代码
- 这块最好还是总结下吧
- 伪代码其实是 思路的体现
- 强调重点
- 与具体的语法独立
- 写起来方便
- 可以翻译成其他语言
- 我至今没有学太好
- 第一见到, 是偏向 py 的伪代码
- 但是 java 中的很多东西, py 不好表达
- 第一见到, 是偏向 py 的伪代码
- 所以希望还是能学会这个东西
- 最好有足够强的表达能力
- 希望可以简单易懂
- 翻译起来, 不那么费劲
- 伪代码其实是 思路的体现
- 这块最好还是总结下吧
-
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出