Java经典设计模式(2):七大结构型模式(附实例和详解)

接下来我们看看结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。其中的对象的适配器模式是各种结构型模式的起源。

一、适配器模式

适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。有点抽象,我们来看看详细的内容。

1.1、类的适配器模式

类的适配器模式核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source的功能扩展到Targetable里。

阅读更多

Java经典设计模式(1):五大创建型模式(附实例和详解)

一、概况

总体来说设计模式分为三大类:

(1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

阅读更多

Docker Get Started

环境

Vmware11 安装 Centos 7 系统,版本如下。

1
2
$ uname -s -r
Linux 3.10.0-229.el7.x86_64

安装

1.使用root账户或具有root权限的用户登录。

2.更新安装包。

1
sudo yum update

阅读更多

Linux 两个好玩的小程序 fortune 和 cowsay

fortune

每次执行这个小程序会随机输出一条名人名言。

下载列表地址:https://rpmfind.net/linux/rpm2html/search.php?query=fortune ,选一个自己合适的版本,进行安装。

我这边下载:ftp://rpmfind.net/linux/opensuse/distribution/13.2/repo/oss/suse/x86_64/fortune-1.99.1-8.1.5.x86_64.rpm ,进行安装。

由于fortune会有依赖包需要安装,所以使用yum安装会方便一点,执行命令:

1
sudo yum -y install fortune-1.99.1-8.1.5.x86_64.rpm

安装完后,执行试试:

1
2
3
4
$ fortune
Life is a concentration camp. You're stuck here and there's no way
out and you can only rage impotently against your persecutors.
-- Woody Allen

阅读更多

Ubuntu update-alternatives 命令

介绍

update-alternatives是符号链接管理工具。用于分组管理命令的链接和优先级。

update-alternatives以链接组进行管理,每一个链接组(link group)都有两种不同的模式:自动模式和手动模式,任一给定时刻一个组都是而且只能是其中的一种模式。

如果一个组处于自动模式,当包被安装或删除时,备选方案系统会自己决定是否和如何来更新相应链接(links)。

如果处于手动模式,备选方案系统会保留原先管理员所做的选择并且避免改变链接(除非发生broken)。

当第一次被安装到系统时链接组被分配为自动模式;如果之后系统管理员对模式的设置做出更改,这个组会被自动转换为手动模式。

--display name

显示链接组的信息。信息包括链接组的模式(自动或手动);链接的指针(链到了那一个文件);优先级是多少;当前最优版本等。

其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/java(需绝对目录);

阅读更多

类似激活码格式的自动转换插件(format CDKey)

调用方式

$(“#cdkey”).formatCdkey({});

默认参数

{
separator:”-“, //默认分隔符
splitLength:4, //分割长度
groupCount:5, //分隔符分隔的组数
isSetCase:true, //是否转换大小写
isToUpCase:true //true转换大写;false转换小写(isSetCase:true时生效)
}

ps:separator仅支持单字符;

默认格式样例:F15A-D165-F168-94BF-A4T9

阅读更多

HTTP 协议学习笔记

请求报文

HTTP请求报文包括两部分:报文首部和报文主体。
报文首部包括:请求方法、请求URI、协议版本、可选的请求首部字段。
报文主体既内容实体(所需要的用户和资源的信息)。

使用wireshark抓包,当访问:http://www.fenxiangz.com/201512/different-between-uri-and-url/ 时,请求报文如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET /201512/different-between-uri-and-url/favicon.png HTTP/1.1\r\n
Host: www.fenxiangz.com\r\n
Connection: keep-alive\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36\r\n
Accept: */*\r\n
Referer: http://www.fenxiangz.com/201512/different-between-uri-and-url/\r\n
Accept-Encoding: gzip, deflate, sdch\r\n
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2\r\n
[truncated]Cookie: saeut=119.57.170.163.1441693203653974; CNZZDATA1256734178=848001758-144704...
\r\n
[Full request URI: http://www.fenxiangz.com/201512/different-between-uri-and-url/favicon.png]
[HTTP request 5/5]
[Prev request in frame: 10097]
[Response in frame: 10117]

说明:
1-9行为报文首部;
1行:请求方法、URI、协议版本
2-9行:可选请求首部字段

10行为空行,分割报文首部和报文实体

11行-尾行:实体内容。

阅读更多

URL 和 URI 的区别

URI, URL, URN

从上面的那幅图可以看出来,一共有三个不同的概念URI,URL,URN。这讨论这样的问题时,最好的方法就是回到原点啊,这里我们在RFC 3986: Uniform Resource Identifier (URI): Generic Syntax里面收集了点资料:

“A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源。”
“A URI 可以进一步被分为定位符、名字或两者都是。术语“Uniform Resource Locator” (URL) 是URI的子集,除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络“位置”)。”

阅读更多

使用 Primefaces remoteCommand 来实现 ajax 请求处理

xhtml代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<h:form>
<p:remoteCommand name="getInfo" action="#{beanUtil.getInfoMethod}"
oncomplete="onGetInfoMethodComplete(xhr,status,args)"/>
</h:form>
<script type="text/javascript" >
getInfo([{name:'param1',value:'param1'},{name:'param2',value:'param2'}]);
function onGetInfoMethodComplete(xhr,status,args){
alert(args.info);//alert "get info"
}
</script>

阅读更多

为使用 JSF FacesContext 的方法编写测试用例 —— Mock JSF FacesContext

最近在编写单元测试的时候,遇到两个问题。
问题1:因为项目使用了JSF框架,很多方法使用了FacesContext这个类,导致在编写这些方法的相关单元测试时,遇到环境问题。
问题2:由于项目与第三方服务有交互(使用HTTP,第三方服务测试服务位于公网),而这两个项目存在相互request的需求,这意味着当第三方服务需要request本项目的时候,只能通过公网IP来访问。这就面临着无法在本地做”第三方服务请求该项目”的相关接口测试。

通过上网查了相关的资料,也找到了一些解决方案。在这里做一个总结。

环境:

JSF 2.0
JUnit 4 - Link
Mockito 2.0 - Link
moco - Link

简要介绍:

Mockito:Mockito是一个针对Java的mocking框架。大白话来解释一下它的功能:Mockito可以在你需要某个对象的时候,模拟出一个来使用它。或者,当你对某个对象调用某个方法的时候,你希望返回的东西,它也可以给你模拟出来。当然,Mockito的功能还不止这些。
moco:可以模拟出一个服务器,让你可以事先配置好请求uri和对于的响应,使得在进行与HTTP相关的单元测试的时候,不必再手动配置一个Server。你可以在单元测试开始时,启动它,在单元测试结束后,关闭它。

阅读更多