在使用国外的代理服务器时,常常会因为各种不稳定因素导致在直连时连接的丢包率特别高。对于一些对丢包率特别敏感的游戏(没错,说的就是舰队Collection),使用丢包率高的线路进行游戏是一件非常痛苦的事情。有的时候,游戏限定某个地区的IP才能够接入(没错,说的还是舰队Collection),所以必须使用架设在那个地区的代理服务器A。这两项加起来就有点麻烦了。但是,如果我们能够找到一个中继服务器B,从本地直连到中继服务器B的丢包率非常低,而从中继服务器B到目标服务器A的丢包率也非常低,这样我们就能够形成一条丢包率较低的线路。这样一条线路有效地提升了那些丢包率敏感的游戏体验。

本地<->中继服务器B<->代理服务器A

在这里,我们在中继服务器B上使用Haproxy将请求转发到目标服务器A上。注意Haproxy只支持TCP连接的转发。

阅读全文 »

TypeScript是微软开发的一种开源的编程语言。它脱胎于JavaScript,为了解决JavaScript用于大型工程时出现的问题。最近几年,由于移动互联网的爆发,web开发越来越复杂,新技术层出不穷。但是JavaScript却迟迟没有进步,其自身的语言短板使得开发web app变成一件非常有挑战性的事情。TypeScript于2012年发布,正如其官方网站所言,目标是成为“JavaScript that scales”。TypeScript推出了类型系统、类等一些特性,其中一些特性已经被引入到下一代JavaScript标准ES6。TypeScript也是知名web应用框架AngularJs 2的推荐编程语言。

阅读全文 »

后序遍历是遍历二叉树的一种方式。其遍历方式是先遍历一个结点的所有左子结点,再遍历其所有右 子结点,最后访问自身。后序遍历有非常简单的递归解法,但是如果要把它转化为非递归的解法的话 会出现一定的困难。

阅读全文 »

意图

Abstract Factory给一类class提供了一个统一接口。Client调用接口时会得到实际起作用的那一个class的实例。 而决定哪一个class起作用的是abstract factory。这样client便与class的具体实现解耦。

应用领域

-系统的实现不关心product是如何创建,组成,表示的;(系统只需要知道有这样一个product。) -系统可以被一类product中的任意一个所配置; -一类product的接口是相同的;(所有的类都是Abstract factory的子类) -提供一个含有相同接口的class的库,你只想提供其接口,而不想提供它的具体实现。

结构

![](/images/2016/10/Abstract Factory.png)

参与者

  • AbstractFactory
  • ConcreteFactory
  • AbstractProduct
  • ConcreteProduct
  • Client

作用过程

client调用AbstractFactory,而实际上,AbstractFactory会使用ConcreteFactory去实例化真正起作用的classclient通过AbstractProduct去处理ConcreteFactory返回的ConcreteProduct。通过继承和多态,这个设计是可以实现的。

优势与劣势

  • 实现了clientconcrete class的隔离。 通常意义上,concrete class才是实际承担工作的class。如何使他们在一起工作?一个本能的想法就是,client直接调用concrete class。 但是当软件需求发生变化时,比如需要一个新的实现。我们将会被迫去修改所有client中对于上一个concrete class的调用。当使用Abstract Factory 模式时,client不会关心实际的concrete class是什么。这样,当需求变化时,只需要修改abstract factory去返回新的concrete class, 而不需要改动client。而后者这种修改显然是更为便捷的。

  • 使得运行时改变生效的concrete class更为容易 abstract factory模式下,改变其返回的concrete class是十分简单的。甚至可以在运行时完成转换。

  • 要求product具有一致性 client通过AbstractProduct去操作实际的ConcreteProduct,显然,需要ConcreteProduct的接口一致。

  • 在添加新需求时缺乏灵活性 ConcreteFactory需要与AbstractFactory的接口保持一致,但是如果在开发过程中出现了新的需求,将不可避免的要更改AbstractFactory, 然后,ConcreteFactory要保持一致的话也需要更改。在一个大型系统中,这个工作量是非常大的。

参考文献

  • [1] Gamma E, Helm R, Johnson R. Design Patterns: Elements of Reusable Object-Oriented Software [M]. Boston: Addison-Wesley, 1994.

为了解决ES5缺乏模块化的问题,ES6正式引进了Module的概念。Module允许开发者们将一个很大的 系统拆分为若干个小的Module。模块化程序设计的概念存在于现今流行的大多数编程语言中。

但是,由于ES6刚刚发布,支持ES6的环境非常少。如果要使用ES6的话,一般需要通过babel等转译器 将使用ES6的js文件转译为ES5的js文件。

阅读全文 »
0%