门面设计模式门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到了这种设计模式。
门面设计模式的原理这么多场合都用到了这种设计模式,那这种设计模式究竟能有什么作用呢?顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。
这种设计模式主要用在一个大的系统中有多个子系统组成时,这多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。
门面设计模式示意图如下:
图 1. 门面示意图
Client 只能访问到 Façade 中提供的数据是门面设计模式的关键,至于 Client 如何访问 Façade 和 Subsystem 如何提供 Façade 门面设计模式并没有规定死。
Tom ...
memcached 是由 Danga Interactive 开发并使用 BSD 许可的一种通用的分布式内存缓存系统。
Danga Interactive 开发 memcached 的目的是创建一个内存缓存系统来处理其网站 LiveJournal.com 的巨大流量。每天超过 2000 万的页面访问量给 LiveJournal 的数据库施加了巨大的压力,因此 Danga 的 Brad Fitzpatrick 便着手设计了 memcached。memcached 不仅减少了网站数据库的负载,还成为如今世界上大多数高流量网站所使用的缓存解决方案。
本文首先全面概述 memcached,然后指导您安装 memcached 以及在开发环境中构建它。我还将介绍 memcached 客户机命令(总共有 9 个)并展示如何在标准和高级 memcached 操作中使用它们。最后,我将提供一些使用 memcached 命令测量缓存的性能和效率的技巧。
如何将 memcached 融入到您的环境中?在开始安装和使用 using memcached 之前,我们需要了解如何将 memcached 融入到您的环 ...
学习机器学习有很多方法,大多数人选择从理论开始。
如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术、类库和方法。这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上。
要想有效地学习机器学习你必须学习相关理论,但是你可以利用你的兴趣及对知识的渴望,来激励你从实际例子学起,然后再步入对算法的数学理解。
通过本文你可以学习到程序员初学机器学习的四种方式。这是给技术人员设计的实用方法,并以实验为依据,你需要做调研并且完成实验才能建立自己的感性知识。
这四种方法分别是:
学习一个机器学习工具
学习一个机器学习数据集
学习一个机器学习算法
实现一个机器学习算法
你应该通读一下这些方法的策略,然后选择你觉得最适合自己的一个,并且有选择性地执行。
1. 学习一个机器学习工具选一个你喜欢的工具或者类库,然后学着用好它。
我推荐你从一个自带数据预处理工具,机器学习算法并且能呈现结果的工作平台开始学习。学习这样一个工作平台能让你更熟悉机器学习从头到尾的整个过程,这比学习一个特定的数据处理技术或者一个机器学习算法更有价值 ...
本篇主要分析:1.如何将byte数组适配至ByteArrayInputStream,对应与IO部分的适配器模式;2.BufferedInputStream的工作原理,对应于IO的装饰器模式,会首先研究InputStream和FilterInputStream的源代码,同时会将要谈谈软件设计中的缓存相关的知识。后面专门一章分析PipedInputStream和PipedOutStream,简单谈谈管道相关的知识,以及软件架构的想法。
1 InputStreamInputStream 是输入字节流部分,装饰器模式的顶层类。主要规定了输入字节流的公共方法。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778package java.io;public abstract class InputStream implements Closeable ...
gzdd
未读 前段日子师兄让我整理开源的公式解析器项目,我到网上查了两天,对大部分有人维护的开源项目进行了整理和总结:现在记在此处。
开源项目名称描述缺点Jeval在运行时解析计算静态和动态表达式;支持数学,布尔,字符串,函数表达式;支持大部分的数学和布尔运算符;支持自定义函数;支持嵌套函数;支持解析;支持自定义变量解析器;官网:http://jeval.sourceforge.net不支持嵌套变量jexel处理大部分的数学公式和字符串,通过继承接口来实现个人所需的运算;支持自定义变量解析器;该项目一直在更新,最近一次更新是今年十月七号wiki:http://code.google.com/p/jexel/w/list不支持变量替换aviatorAviator是直接将表达式编译成Java字节码,交给JVM去执行支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(=~)、三元表达式?: ,并且支持操作符的优先级和括号强制优先级;支持函数调用和自定义函数;支持传入变量,支持类似a.b.c的嵌套变量访问;支持数组的访问;支持正则表达式;http://www.b ...
摘要: 将应用交付给终端用户正变得越来越难,因为会涉及到更多的组件,也因此更容易犯错。技术性能公司Compuware总结了贯穿应用始终的八大影响应用性能的陷阱,望开发者引以为戒。
数据库访问低效、框架配置错误、内存使用过度、网页臃肿,以及不遵循常见Web性能最佳实践都是应用开发中常见的、影响应用性能的主要陷阱 。技术性能公司Computeware从实际案例总结了贯穿应用始终的八大影响应用性能的陷阱,这些陷阱不仅仅局限于应用开发中,还涉及到整个应用交付流程,包括从终端用户到后台系统的所有组件、数据库以及第三方服务等等,望运维人员、架构师、测试人员和开发人员引以为戒。CSDN摘译如下:
一、臃肿的Web前端
面向群体:运维人员、架构师、测试人员、开发人员
通常企业在重构代码、优化SQL语句、应用缓存等方面都作了充足的优化,其中大部分对应用的最终用户并不可见。然而直接与用户交互的Web前端却被常常被完全忽视。
根据我们跟踪的来源,传递给用户的页面在过去的3-4年里,无论是大小还是复杂度都稳步增长,同时增长的还有用户对性能的要求。企业需要意识到,他们认为重要的其实并不是最重要的,他们更 ...
JUnit
JUnit
JUnit是由Erich Gamma 和Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
http://www.junit.org/
Cactus
Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
http://jakarta.apache.org/cactus/
Abbot
Abbot是一个用来测试Java GUIs的框架。用简单的基于XML的脚本或者Java代码,你就可以开始一个GUI。
http://abbot.sourceforge.net/
...
高性能系统设计
未读 一、功能定义:
–商品 :展示商品,商品管理,……
–交易 :创建交易,交易管理,……
–用户 :注册用户,信息查询,用户管理,……
二、技术发展
第一版:简单基础版
出于快速开发的考虑,第一版往往采用单台机器构建(这里采用java技术,下同),这样开发方便而且快速,采用的技术甚至可以是最简单的jsp,servlet等。
它的技术特点:
•三个功能模块
•一个数据库中的三个表
•连接数据库使用了JDBC
•模块之间的调用是JVM内部的方法调用
第二版:应用和数据库分离
随着访问量的上升,这台机器的负载越来越高,这时可以说是该网站遇到的第一个性能问题,此时一般的解决方案很简单,将应用(App)和数据库(DB)拆分到两台机器上
这种改造实现了应用服务器和数据服务器的分离,对开发、测试、部署,没什么影响。
第三版:多台应用服务器
访问量持续上升,应用服务器的压力也变的很大,第二版的简单设计已经不能支撑这么大的访问量,所以不得不继续对其进行改造。
它的设计方案就是将应用从1台拆分到了两台,甚至多台。但此时会遇到的问题——sessio ...
问题提出:12.0f-11.9f=0.10000038,”减不尽”为什么?
现在我们就详细剖析一下浮点型运算为什么会造成精度丢失?
1、小数的二进制表示问题
首先我们要搞清楚下面两个问题:
(1) 十进制整数如何转化为二进制数
算法很简单。举个例子,11表示成二进制数:
11/2=5 余 1
5/2=2 余 1
2/2=1 余 0
1/2=0 余 1
0结束 11二进制表示为(从下往上):1011
这里提一点:只要遇到除以后的结果为0了就结束了,大家想一想,所有的整数除以2是不是一定能够最终得到0。换句话说,所有的整数转变为二进制数的算法会不会无限循环下去呢?绝对不会,**整数永远可以用二进制精确表示 **,但小数就不一定了。
(2) 十进制小数如何转化为二进制数
算 ...
原文:https://blogs.oracle.com/corejavatechtips/source-code-analysis-using-java-6-apis
静态代码分析工具Checkstyle, FindBugs,以及IDE如NetBeans, Eclipse能快速进行代码关联,它们使用了API解析代码,生成AST,深入分析代码元素。JAVA 6 提供了3种新API来完成这样的任务:
http://www.jcp.org/en/jsr/detail?id=199">Java Compiler API(JSR 199),
http://www.jcp.org/en/jsr/detail?id=269">Pluggable AnnotationProcessing API (JSR 269)
http://java.sun.com/javase/6/docs/jdk/api/javac/tree/index.html">CompilerTree API.
在本文中,我们探讨了其中每个 API 的功能,并继续开发一个简单的演示应用程 ...
