最新文章

设计模式笔记(九)-- 中介者模式
​中介者模式可以实现互不依赖的各个类之间进行通信协作。 问题提出 只要创建过桌面应用程序或移动端应用程序,就应该使用过中介者模式,但可能你自己都不知道已在使用该模式。 比如,左侧是文章列表,右侧是编辑文章的表单。“Save”按钮当前是禁用的,因为未选择任何文章。 当我们选择文章1(Article 1)时,文本框将被填充而且我们的”Save”按钮也启用了。 当我们删除文本框的内容时,按钮又被禁用了。...
设计模式笔记(八)-- 观察者模式
​观察者模式是另一种非常有用和流行的模式,同样应用于很多框架中,在对象状态发生变化且需要将这些变化通知其他对象的情况下使用此模式。 问题提出 假设我们设计电子表格。 我们用饼图展示单元格的值,当单元格的值变化时,饼图即时反映这种变化。同样Total也即时反映单元格的更改进行重新计算。 变化的单元格值是数据源(DataSource),饼图和总数Total必须即时了解数据源的变化。 用代码模拟。 创建类...
设计模式笔记(七)-- 命令模式
​命令模式非常有用,它用于很多框架中,您可能在不知情的情况下已使用了这种模式。利用命令模式可以实现命令的发送者与接收者的解耦,并可实现复合命令和可撤销命令。 问题提出 假设我们要设计一个用户界面的框架。 我们创建像Button,CheckBox,TextBox等用户界面组件,其他开发者可以使用我们的组件构建出复杂的界面。 以Button为例。 创建类Button,它有私有属性label,还有一个方法click()。...
设计模式笔记(六)-- 模板方法模式
模板方法模式定义了任务的模板或骨架,具体的操作由子类完成。 问题提出 假设我们要创建一个银行应用程序。 我们需要对用户的操作进行记录,每次操作时我们都要跟踪记录谁在什么时间操作了什么。这里我们举例两个不同操作:账户间转账和生成一些财务报表。 我们不想在一个类中通过不同的方法来实现这两个操作,因为如果我们要修改某个操作或想支持新的操作就要回来修改这个类。我们希望我们的系统对修改闭合而对扩展开放。所以我们对每一种操作都用一个类来表示。...
设计模式笔记(五)-- 策略模式
策略模式可以根据不同的行为使用不同的策略。 问题提出 假设我们要存储用户上传的图像。 类ImageStorage有一个store方法,在store方法里,我们先对图像进行压缩,再给图像应用某种滤镜,然后进行存储。 这个实现有一些问题。 首先,它违反了单一职责原则,store方法不仅负责存储图像,还负责了压缩图像,以及给图像应用滤镜。 其次,添加新的压缩算法或新的滤镜需要修改原来的实现,修改比较困难。...
设计模式笔记(四)-- 迭代器模式
​本文讨论迭代器模式,这是一个非常有用且流行的模式,很多语言和框架里都会用到。 问题提出 比如,我们要创建一个Web浏览器。 每一个Web浏览器都有历史记录的概念,我们访问不同的web站点,然后点击“回退”按钮就能返回到历史浏览记录,让我们尝试在代码里实现。 创建BrowserHistory类,它有一个类型为List<String>的私有属性 urls,并有push、pop方法用于urls的操作。...
设计模式笔记(三)-- 状态模式
​状态模式是面向对象多态性原则的极好体现,同样的方法根据实际状态可以实现不同的操作,但我们不能滥用状态模式。 问题提出 假设我们要创建一个类似Photoshop的画图应用程序。 选择某个工具,比如选择画笔工具,按下并拖动鼠标,在画布上画画,释放鼠标就可以画出线条;如果选择橡皮擦工具,则会清除绘制的内容;如果是选择工具,则可能会框出一个虚线的矩形。总之要根据不同的工具,在画布上渲染不同的图形。画布的事件是按下鼠标(mouseDown)和释放鼠标(mouseUp)。...
设计模式笔记(二)-- 备忘录模式
​备忘录模式可以实现撤销机制。 问题提出 我们设计一个编辑器Editor,希望编辑的内容content可以多次撤销。 如图,我们创建了一个新package名为memento,并创建Editor类。Editor有private属性content,同时设置了getContent和setContent。再在main函数中,调用Editor,编辑其content,并允许调用undo()来撤销编辑的内容。 思考下,我们该如何实现?...
设计模式笔记(一)-- 必备知识
本系列讲解设计模式,本文是第一篇,介绍学习设计模式的一些必备知识。 说明 学习本系列,您首先得有基本的编程经验,其次要对面向对象有初步的了解,本系列不讲算法(有机会可以出一个系列),不创建应用,只关注如何创建可重用、可扩展的面向对象软件。 什么是设计模式 软件设计中经常有重复的代码,设计模式就是优雅解决重复问题的方案。 例如,我们经常有重复撤销(undo)的操作,有几种不同模式可以实现undo操作,其中之一是备忘录模式(memento...
TypeScript教程(十)-- Node应用
​本文是本系列最后一篇,使用Node Express和TypeScript构建一个相对简单的API。 使用Node执行TypeScript代码 新建文件夹 reminders-api,并用vscode打开。再新建index.ts,写一些TypeScript代码,并使用node执行它。 提示出错了。 因为Node使用了JavaScript引擎,它并不识别TypeScript。我们有两个选择。 第一种选择,先编译成JavaScript(tsc...