版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434884
关于java 自带 Observable:
- 变量不可以持有具体类的引用(使用 new,就会持有具体类的引用);
- 不要让类派生自具体类(否则会依赖具体类),应该派生自一个抽象(接口或者抽象类);
- 不要覆盖基类中已经实现的方法(基类中已经实现的方法,应该由所有子类共享);
P.S:关于 volatile 与 synchronized 关键字:
- 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存;当有其他线程需要读取时,它会去内存中读取新值;
- 同时,volatile 关键字禁止进行指令重排序;
- volatile 关键字保证变量的可见性,不保证操作的原子性,一定程度上保证指令的有序性;由于 volatile 无法保证操作的原子性,所以虽然 volatile 的性能由于 synchronized 关键字,但 synchronized 关键字也不能被 volatile 取代。
命令模式的 UML 图如下:
命令模式部分心得如下:
- 首先,客户通过目标接口,调用适配器的方法,对适配器发出请求;
- 然后,适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口;
- 最后客户接收到调用的结果;
- **在该过程中,客户并未察觉到一切操作是适配器在其转换作用**,也可以说,**客户与被适配者之间是解耦的,互相是不知道对方的存在的**。
- 外观模式的意图在于简化接口,避免客户与子系统之间的紧耦合;
- 适配器模式将一个或多个类接口,变成客户所期望的一个接口,其意图在于将接口转换成其他接口;
- 该对象本身;
- 被当作输入参数而传递进来的对象;
- 该方法所创建或实例化的任何对象(即局部变量);
- 该对象的任何组件;
- 高层组件可以理解为基类(用于控制算法实现);
- 低层组件可以理解为派生类(用于实现部分高层组件的具体实现);
- 相同点:两者的作用都在于**对算法的封装**;
- 不同点:策略模式使用组合的方式,模板方法模式使用继承的方式;
- **hasNext()**:告诉我们在这个聚合中是否还有更多的元素;
- **next()**:返回这个聚合中的下一个对象;
- **客户 (Client)**:使用**组合 (Componet)** 的接口,对组合中的对象进行操作;
- **组合 (Component)** :为**组合 (Componet)** 中的所有对象定义一个接口,为**组件 (Composite)** 与**叶节点 (Leaf)** 提供部分默认方法;
- **叶节点 (Leaf)** :没有子节点的组件;**叶节点 (Leaf)** 通过实现**组件 (Composite)** 的行为,定义了组合内元素的行为;
- **组件 (Composite)** :定义**具有子节点**的组件的行为;**组件 (Composite)** 也实现了**叶节点 (Leaf)** 相关的操作(且某些操作对组件意义不大,可能会产生异常);组合、组件、叶节点的关系:
- **组合 (Component)** 包含**组件 (Composite)** ;
- **组件 (Composite)** 包含两种:**组合 (Component)** (指组件中,可以包含一个子组合,含义类似于递归)和**叶节点 (Leaf)** ;
(本文持续更新ing….)