设计模式-代理模式
定义为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用。
适用场景
保护目标对象。
增强目标对象。
UML
静态代理
动态代理
总结
优点
代理模式能将代理对象与真实被调用的目标对象分离。
一定程度上降低了系统的耦合度,扩展性好。
保护目标对象。
增强目标对象。
缺点
代理模式会造成系统设计中类的数目增加。
在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
增加系统的复杂度。
设计模式-桥接模式
定义将抽象部分与它的具体实现部分分离,使他们都可以独立的变化。通过组合的方式建立两个类之间的联系,而不是继承。
适用场景
抽象和具体实现之间增加更多的灵活性
一个类存在两个(或多个)独立变化的纬度,且这两个(或读个)纬度都需要进行独立的扩展。
不希望使用继承,或因为多继承导致系统类的个数剧增。
UML
在桥接模式结构图中包含如下几个角色:
Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了 一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关 联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。
RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。
Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上 ...
设计模式-组合模式
定义将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使客户端对单个对象和组合对象保持一致的处理方式。
适用场景
希望客户端可以忽略组合对象与单个对象的差异时。
处理一个树形结构时。
UML
总结
优点
清楚的定义分层次的复杂对象,表示对象的全部或部分层次。
让客户端忽略层次的差异,方便对整个层次结构进行控制。
简化客户端代码。
符合开闭原则
缺点
限制类型时会较为复杂。
使设计变的更加抽象。
设计模式-享元模式
定义提供了减少对象数量从而改善应用所需的对象结构的方式。运用共享技术有效的支持大量细粒度的对象。
适用场景
常常应用于系统底层的开发,以便解决系统性能的问题。
系统有大量相似对象,需要缓冲池的场景。
UML
总结
优点
减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率。
减少内存之外的其他资源的占用。(减少new操作所需的时间)
缺点
关注内/外部状态,关注线程安全问题。
使程序的逻辑复杂化。
设计模式-外观模式
定义为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
UML
总结
外观模式的主要优点如下:
(1) 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
(2) 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客 户端,只需要调整外观类即可。
(3) 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
外观模式的主要缺点如下:
(1) 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
(2) 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
设计模式-单例模式2
单例模式安全问题
序列化和反射问题:
public class HungrySingleton implements Serializable,Cloneable{
private final static HungrySingleton hungrySingleton;
static{
hungrySingleton = new HungrySingleton();
}
private HungrySingleton(){ //反射时处理,如果已存在则抛出异常
if(hungrySingleton != null){
throw new RuntimeException("单例构造器禁止反射调用");
}
}
public static HungrySingleton getInstance(){
return hungrySingleton;
} ...
jenkins自动构建配置
安装jenkins
官网下载jenkins jenkins
终端运行:java -jar jenkins.war –httpPort=8080 8080为端口号,可以自行设置
在浏览器中输入:http://localhost:8080 访问jenkins服务
首次启动jenkins,出于安全考虑,jenkins会生成一个随机的口令到 /root/.jenkins/secrets/initialAdminPassword 文件中,复制文件中的口令到jenkins即可通过访问。
安装ant
官网下载Ant Ant
配置环境变量
ANT_HOME ant的根路径
path $ANT_HOME/bin
classpath $ANT_HOME/lib
验证 终端输入 ant 有正常的输出,则表示安装成功
配置tomcat
配置tomcat-users.xml 添加角色和用户
<role rolename="manager-gui"/>
<r ...
高性能js读书笔记
动态脚本元素var script = document.createElement("script");
script.type = "text/javascript";
script.src = "file1.js";
document.getElementsByTagName("head")[0].appendChild(script);
这种技术的重点在于:无论何时启动下载,文件的下载和执行过程都不会阻塞页面其他进程。
memcached
安装Libevent:
官网下载,解压缩
./configure –prefix=/opt/install/libevent
make && make install
memecached:
解压缩
./configure –prefix=/opt/install/memcached –with-libevent=/opt/install/libevent
make && make instll
启动启动参数:
-d 启动一个守护进程
-m 分配给memcached 的内存数量(单位为M)
-u 运行memcached 的用户
-L 监听的服务器IP地址
-p 监听的端口号
-c 最大运行的并发连接数
-P 设置Pid 文件
操作
java客户端
mac安装autojump
brew install autojump
编辑 vim ~/.zshrc
找到 plugins=,在后面添加autojump:plugins=(git autojump)
新开一行,添加:[[ -s $(brew –prefix)/etc/profile.d/autojump.sh ]] && . $(brew –prefix)/etc/profile.d/autojump.sh
j + 跳转的目录
tmux配置使用
什么是tmuxtmux是一个工具,用于在终端窗口中运行多个终端会话,可以使终端会话进入后台运行。
安装
$ brew install tmux
快捷键前缀为了使自身的快捷键不和其他软件的快捷键产生冲突,tmux提供了一个快捷键前缀。当使用快捷键时要先按下快捷键前缀,然后再按下快捷键,默认的前缀是Ctrl-b
创建会话
tmux new -s
假如还需要开发另一个项目,可以再创建一个新会话,但原来的会话不会消失,若要创建一个新会话,只需要按下
:,然后输入
new -s
除非显式的关闭会话,否则tmux的会话在重启计算机之前都不会消失。
切换会话
获取会话列表
s
列表中的每个会话都有一个 ID,该 ID 是从 0 开始的。按下对应的 ID 就可以进入会话。如果你已经创建了一个或多个会话,但是还没有运行 tmux,那么可以输入如下命令以接入已开启的会话:
tmux attach
会话外获取会话列表:
tmux ls
tmux attach/a -t 在会话外进入session
tmux attach/a 进入列表第一个 ...
svn安装和配置
安装服务器端程序
yum install -y subversion
创建并配置版本库
创建版本库目录
mkdir -p /var/svn/repository
版本库目录下创建具体的项目目录(可以多个)
创建svn版本库
svnadmin create /var/svn/repository/项目目录
配置svn对应的服务
svn://ip:3690/项目目录 (默认端口号3690)
修改服务配置
/etc/rc.d/init.d/svnserve (注意备份)
原版:args=”–daemon –pid-file=${pidfile} $OPTIONS”
修改版:args=”–daemon –root=/var/svn/repository(版本库根目录) –listen-port 2255(实际的端口号) –pid-file= ...