首页
Hu's Notes
取消

【设计模式】详解组合模式

组合模式通过树形结构,统一了对【对象】和【对象集合】的操作。用户无需理会面对的是一个对象还是一群对象,它们的操作手段是统一的。 需要与前文 详解迭代器模式 结合阅读。 问题场景 依然用 详解迭代器模式 的菜单例子。 迭代器模式中,我们需要合并早餐店和咖啡店的菜单,两者分别都只有一份菜单。 假如现在出现了新的需求,咖啡店的菜单中需要加上一份子菜单——甜品菜单。应当如何修改程序...

【设计模式】详解迭代器模式

迭代器模式在对象集合内部实现未知的情况下,为类型不同的对象集合提供统一的遍历迭代方法。 问题场景 《HF》的例子:早餐店和咖啡店合并,需要统一菜单。 早餐店的菜单使用 ArrayList,咖啡店菜单使用数组。统一菜单时,需要用两个 for 循环调用不同的 API 实现。 有什么设计方法,能够在统一菜单时,无需知道菜单各自内部的数据结构,直接统一遍历合并菜单?提供一个统一的「迭代器」接...

【设计模式】详解模版方法模式

模版方法模式确定算法的基本步骤/执行架构,由子类为其中一个或多个步骤填充细节。 模版方法模式满足「支持扩展,拒绝修改(open to expansion, closed to modification)」的开闭设计原则。i.e. 在不修改任何源码的情况下,扩展项目功能。 问题场景 youtube up 主用设计海报作为例子讲解。 设计海报可以遵循一个基本流程:首先设计海报的架构,比如...

【工具】Docker image/container/volume 概念及其使用

Docker 101 tutorial 的阅读笔记。 Docker 最重要的三个概念: container:动态概念,运行中的 app。类似「进程」的概念。 image:静态概念。 volume:磁盘。 通过 Docker 创建 app 的简易流程: 创建文件 Dockerfile(无扩展名)。包含可读性强的代码,写明 app 的环境构建、启动流程 ...

【设计模式】详解外观模式

外观模式简化了系统与用户的交互流程。提供统一接口访问系统和其下的子系统的所有接口。用户只需要与外观接口交互就能使用整个系统。 问题场景 高解耦系统(所有类的设计遵循「单一责任原则」,即每一个类只负责最小的功能)通常拥有相互组合但解耦的数量众多的类。初始化某个系统可能涉及到较繁杂的实例化流程(因为类 A 可能需要类 B 的实例用于初始化,而类 B 又需要类 C 的实例初始化)。 复...

【设计模式】详解适配器模式

适配器沟通了两种本不兼容的接口。 adapter 电源适配器,就是充电头。别名 wrapper。e.g. 让中式插头能够用日式插座充电。 问题场景 假设我想在日本的咖啡店里使符合中国标准的笔记本电脑,则需要使用一个电源适配器: 电脑线的中式插头 => 适配器 => 咖啡店的日式插座 电源适配器解决电器/电线与插座的适配问题,我们不需要更换电脑充电线甚至更...

【进阶算法】欧拉图中的欧拉通路和欧拉回路问题

力扣上的两道欧拉图问题: 332. 重新安排行程 753. 破解保险箱 前置知识 欧拉通路:不重复经过同一条边的前提下,遍历完图的全部结点。 欧拉回路:不重复经过同一条边的前提下,遍历完图的全部结点的一条环路。 欧拉图:存在欧拉回路的连通图。 半欧拉图:存在欧拉通路但不存在欧拉回路的连通图。 有向图存在欧拉通路的充要条件:图连通且每一个结点的入度和出度...

【设计模式】详解命令模式

命令模式通过封装「命令执行者」和「命令执行者的一个或一组操作」,将命令的发出者和执行者解耦。 用《Head First》的餐厅例子来帮助理解「发出者和执行者解耦」: 餐厅中,服务员负责记录顾客的点单,厨师接收服务员记录好的订单然后制作餐食。其中,服务员是命令发出者,厨师是命令执行者。 服务员不需要知道餐点的具体制作方法,只需要记录订单并给厨师传递订单;厨师也不需要管服务员如何记录订单,...

【设计模式】详解单例模式

单例模式是一个奇怪的设计模式:一个类只有一个实例,并提供全局接口来访问这个唯一实例。 部分人(油管 up 主)的观点:永远别用单例模式。 问题场景 问:如何实现单例模式?如何保证类只有一个实例? 答:让类的构造函数私有。永远杜绝 new ClassName() 获得实例的方式。 问:既然类的构造函数是私有的,那么第一个且唯一一个实例又由谁来实例化呢? 答:由类的 stat...

【设计模式】详解装饰者模式

装饰者模式可以在不修改代码和不创建新的子类的情况下,动态地为对象扩展功能。 问题场景 假设我们开了一家咖啡店。 假设这家店是星巴克,它拥有一个饮料超类,名为 Beverage。所有咖啡子类都继承自这个饮料超类。饮料超类主要有两个成员函数: class Beverage{ // 抽象类 constructor(){ this.description = "def...