再看设计模式——状态模式与策略模式

根据不同的状态,执行不同的行为。相比switch case思路,使用状态模式能让数据与行为封闭性更好,添加新的状态也比较简单,状态间的切换逻辑不用刻意去维护,但是不如switch切换状态顺序流那么清晰。 实际实现中状态模式对”开闭原则”的支持并不太好。有两种实现存放的思路: 静态状态。初始化时把所有可能的状态对象都new好,状态切换时通过赋值改变当前的状态。 实例化状态。每 …

阅读全文

再看设计模式——单例模式

这个模式其实就是要保证只有一个实例存在。通常的实现思路就是持有一个私有静态实例,保证仅一次初始化,以getInstance方法返回。但是实际实现这个模式要考虑更多细节:  线程安全与DLC 单例对象的析构与销毁 组件中单例对象的管理 单例模式的单元测试 使用C++实现还必须额外注意一些实现细节 静态成员变量初始化顺序不依赖构造函数, 多个单例可能初始化顺序不对 延迟初始化(第一次使用才初始化)需要 …

阅读全文

volatile与内存屏障总结

一. 内存屏障 Memory Barrior 1.1 重排序 同步的目的是保证不同执行流对共享数据并发操作的一致性。在单核时代,使用原子变量就很容易达成这一目的。甚至因为CPU的一些访存特性,对某些内存对齐数据的读或写也具有原子的特性。但在多核架构下即使操作是原子的,仍然会因为其他原因导致同步失效。 首先是现代编译器的代码优化和编译器指令重排可能会影响到代码的执行顺序。 其次还有指令执行级别的乱序 …

阅读全文

每月技术提升2018年8~10月

每月技术追踪 [移动前端]Angular 7发布,新版本带来了虚拟滚动、拖放、CLI Prompts等特性。 [编程语言]微软正式发布TypeScript 3.0,这是TypeScript之旅的一个新的里程碑。3.0虽然是个大版本,但并没有包含太多重大的变更(也就是说升级很容易)。新版本引入了一种新的灵活且可扩展的方式来构建项目、对操作参数列表提供了更强大的支持、新的强制显式检查类型、更好的JSX …

阅读全文