问题你需要与一个 MongoDB 数据库连接的接口。解决方案对于 Node.js安装如果你的计算机中还没有 MongoDB ,需要安装。安装本地 MongoDB 模块。保存记录mongo = require 'mongodb'server = new mongo.Server "127.0.0.1", 27017, {}client = new mongo.
问题定义一个算法的结构,作为一系列的高层次的步骤,使每一个步骤的行为可以指定,使属于一个族的算法都具有相同的结构但是有不同的行为。解决方案使用模板方法( Template Method )在父类中描述算法的结构,再授权一个或多个具体子类来具体地进行实现。例如,想象你希望模拟各种类型的文件的生成,并且每个文件要包含一个标题和正文。
问题解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。解决方案在策略对象(Strategy objects)中封装你的算法。例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。基类StringSorter = (algorithm) -> sort: (list) -> algorithm list策略bubbleSort = (list) -> anySwaps = false swapPass = ->
问题许多时候你想要一个,并且只要一个类的实例。比如,你可能需要一个创建服务器资源的类,并且你想要保证使用一个对象就可以控制这些资源。但是使用时要小心,因为单件模式可以很容易被滥用来模拟不必要的全局变量。解决方案公有类只包含获得一个实例的方法。实例被保存在该公共对象的闭包中,并且总是有返回值。
问题当一个事件发生时你不得不向一些对象发布公告。解决方案使用观察者模式(Observer Pattern)。class PostOffice constructor: () -> @subscribers = [] notifyNewItemReleased: (item) -> subscriber.callback(item) for subscriber in @subscribers when subscriber.item is item subscribe: (to, onNewItemReleased) ->
问题你想预测对一个对象做出改变后的反应。解决方案使用备忘录模式(Memento Pattern)来跟踪一个对象的变化。使用这个模式的类会输出一个存储在其他地方的备忘录对象。如果你的应用程序可以让用户编辑文本文件,例如,他们可能想要撤销上一个动作。你可以在用户改变文件之前保存文件现有的状态,然后回滚到上一个位置。
问题其他人需要以控制方式运行你的一部分代码。相对地,你选择的语言不能以一种简洁的方式表达问题域。解决方案使用解释器模式来创建一个你翻译为特定代码的领域特异性语言( domain-specific language )。我们来做个假设,例如用户希望在你的应用程序中执行数学运算。你可以让他们正向运行代码来演算指令(eval)但这会让他们运行任意代码。
问题直到开始运行你才知道需要的是什么种类的对象。解决方案使用 工厂方法(Factory Method) 模式和选择对象都是动态生成的。你需要将一个文件加载到编辑器,但是直到用户选择文件时你才知道它的格式。一个类使用工厂方法 ( Factory Method ) 模式可以根据文件的扩展名提供不同的解析器。class HTMLParser constructor: ->
问题你有一组数据,需要在多个过程、可能变换的方式下处理。解决方案使用修饰模式来构造如何更改应用。miniMarkdown = (line) -> if match = line.match /^(#+)\s*(.*)$/ headerLevel = match[1].length headerText = match[2] "<h#{headerLevel}>#{headerText}</h#{headerLevel}>" else if line.length >
问题你需要让另一个对象处理你自己的可执行的代码。解决方案使用 Command pattern 传递函数的引用。# Using a private variable to simulate external scripts or modulesincrementers = (() -> privateVar = 0 singleIncrementer = () -> privateVar += 1 doubleIncrementer = () ->
问题你需要准备一个复杂的、多部分的对象,你希望操作不止一次或有不同的配置。解决方案创建一个生成器封装对象的产生过程。Todo.txt 格式提供了一个先进的但还是纯文本的方法来维护待办事项列表。手工输入每个项目有损耗且容易出错,然而 TodoTxtBuilder 类可以解决我们的麻烦:class TodoTxtBuilder constructor: (defaultParameters={ }) ->
问题你需要为代码保持一个可靠的接口,可以经常变化或者在多种实现间转换。解决方案使用桥接模式作为不同的实现和剩余代码的中间体。假设你开发了一个浏览器的文本编辑器保存到云。然而,现在你需要通过独立客户端的端口将其在本地保存。class TextSaver constructor: (@filename, @options) -> save: (data) ->
问题想象你去国外旅行,一旦你意识到你的电源线插座与酒店房间墙上的插座不兼容时,幸运的是你记得带你的电源适配器。它将一边连接你的电源线插座另一边连接墙壁插座,允许它们之间进行通信。同样的情况也可能会出现在代码中,当两个 ( 或更多 ) 实例 ( 类、模块等 ) 想跟对方通信,但其通信协议 ( 例如,他们所使用的语言交流 ) 不同。在这种情况下,Adapter 模式更方便。
问题你想通过网络提供持续的服务,与客户保持持续的联系。解决方案创建一个双向 TCP 服务器。在 Node.js 中net = require 'net'domain = 'localhost'port = 9001server = net.createServer (socket) -> console.log "New connection from #{socket.remoteAddress}" socket.on 'data', (data) -> console.log "#{socket.
问题你想通过网络提供持续的服务,与客户保持持续的联系。解决方案创建一个双向 TCP 客户机。在 Node.js 中net = require 'net'domain = 'localhost'port = 9001ping = (socket, delay) -> console.log "Pinging server" socket.write "Ping" nextPing = -> ping(socket, delay) setTimeout nextPing, delayconnection = net.
问题你想在网络上提供一个服务器。解决方案创建一个基本的 TCP 服务器。在 Node.js 中net = require 'net'domain = 'localhost'port = 9001server = net.createServer (socket) -> console.log "Received connection from #{socket.remoteAddress}" socket.write "Hello, World!\n" socket.end()console.
问题你想在网络上创建一个 HTTP 服务器。在这个方法中,我们将逐步从最小的服务器成为一个功能键值存储。解决方案我们将使用 node.js HTTP 库并在 Coffeescript 中创建最简单的 web 服务器。开始 'hi\n'我们可以通过导入 node.js HTTP 模块开始。这会包含 createServer ,一个简单的请求处理程序返回 HTTP 服务器。我们可以使用该服务器监听 TCP 端口。
问题你想创建一个 HTTP 客户端。解决方案在这个方法中,我们将使用 node.js's HTTP 库。我们将从一个简单的客户端 GET 请求示例返回计算机的外部 IP 。关于 GEThttp = require 'http'http.get { host: 'www.google.com' }, (res) -> console.log res.statusCodeget 函数,从 node.js's http 模块,发出一个 GET 请求到一个 http 服务器。
问题你想使用网络上提供的服务。解决方案创建一个基本的 TCP 客户机。在 Node.js 中net = require 'net'domain = 'localhost'port = 9001connection = net.createConnection port, domainconnection.on 'connect', () -> console.log "Opened connection to #{domain}:#{port}."connection.on 'data', (data) -> console.
问题你需要搜索一个字符串,并返回匹配的起始位置或匹配值本身。解决方案有几种使用正则表达式的方法来实现这个功能。其中一些方法被称为 RegExp 模式或对象还有一些方法被称为 String 对象。RegExp 对象第一种方式是在 RegExp 模式或对象中调用 test 方法。test 方法返回一个布尔值:match = /sample/.test("Sample text")# => falsematch = /sample/i.
关注时代Java