自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 Chapter 10 策略模式

1 概述策略(Strategy)模式和模板方法模式一样,是关于类的行为模式。其设计的初衷是针对一组算法,将其每一个都封装到具有共同接口的独立类中,使其可以互相替代,而不影响客户端的逻辑。策略模式提供了对OCP原则(开闭原则)的完美支持,使得用户可以在不修改原有系统的基础上选择算法(即策略),并且可以灵活的增加新的算法(策略)。2 实现方式2.1 重要概念策略模式一般

2017-02-07 13:55:01 239

原创 Chapter 9 模板方法模式

1 概述模板方法(Template Method)模式是关于类的行为模式。在一个抽象类中定义一个算法的骨架,其中一些步骤和逻辑已经实现,而将另外一部分步骤和逻辑推迟到子类中去实现。模板方法模式使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤。模板方法模式让不同的子类可以用不同的方式实现抽象的方法,从而让算法有不同的实现。2 实现方式2.1 重要的概念在

2017-02-06 16:16:19 273

原创 Chapter 8 观察者模式

1 概述观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,其主要描述的是对象间的一种一对多的依赖关系,当某个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新相关状态。在一个软件系统中,常常会要求某个对象的状态发生变化的时候,某些其它的对象要做出相应的改变。当然,做到这一点有很多的方式,为了使系统能易于复用,应选择低耦合度的方案。

2017-01-23 20:32:14 372

原创 Chapter 7 适配器模式

1 概述适配器(Adapter)模式把某个类的接口转换成客户端所需要的另外一个接口,从而使得因接口不匹配无法一起工作的类功能顺利的一起工作。和其它设计模式一样,适配器模式也是从现实生活中抽象出来的。以电器为例,电视机的插头一般都是三相的,即阴极,阳极及地极,而有些房间的电源插座却只有两相,没有地极。因此,电源插座和电视机插头直接不匹配造成电视机无法使用。这时候,如果有一个插排完成两项到三相

2017-01-15 16:09:41 272

原创 Chapter 6 装饰者模式

1 概述装饰者(Decorator)模式是一种常见的设计模式,其旨在不改变原有类和不使用继承的情况下,动态地扩展一个类的功能。装饰者模式的实现方式是定义一个包装类(Wrapper)或者叫装饰类,该类维护一个被装饰类的引用。在调用功能函数时,装饰类除了调用被装饰类的方法外,还调用增强的功能,从而达到动态扩展类功能的作用。2 实现方式2.1 实现过程装饰者模

2017-01-09 17:51:44 259

原创 Chapter 5 代理模式

1 概述代理(Proxy)模式是一种常见的设计模式,其具体含义是给某一对象提供代理对象,代理对象和具体对象实现共同接口,并且代理对象中维护了具体对象的引用,外界对具体对象的操作需要通过代理对象调用具体对象的方法来实现。 代理模式的优点在于减小了客户端和具体对象间的耦合性并且满足了OCP(Open Close Priciple,开闭原则)。代理模式在实际生活中的应用也是非常常见的,比

2017-01-08 22:26:24 246

原创 Chapter 4 原型模式

1 概述原型(Prototype)模式是一种创建型设计模式,其允许通过一个对象创建另外一些可定制的对象,而无需知道任何如何创建的细节。当某个结构复杂的对象由于需求的变化经常面临剧烈的变化,其创建过程也经常需要变化,但是该对象应该对外暴露一个稳定的创建接口,在这种场景下就比较适用原型模式。原型模式的主要实现方式是:将一个原型对象传递给调用创建接口的对象,该对象通过请求原型对象拷贝自身

2017-01-08 14:48:36 204

原创 Chapter 3 建造者模式

1 概述建造者(Builder)设计模式的定义是这样的:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。建造者模式将复杂的内部创建过程封装起来,对于外部调用者来说,只需传入建造者和建造工具,对于内部如何形成成品的,调用方无需关心。在现实的软件系统中,一个复杂的对象有时候是由各个部分的子对象构成的;由于需求的变化,这些组成部分经常面临着剧烈的变化,但是它们组合在

2016-12-19 20:59:36 244

原创 Chapter 2 工厂设计模式

1 概述和单例设计模式一样,工厂设计模式也是属于创建型模式。其主要作用是抽象了对象被创建时的具体细节,对外暴露一个创建的方法,省去用户new一个对象的操作。乍一看,工厂设计模式只是抽象了一个new对象的操作。其实,实际项目中new一个对象的逻辑比较复杂,如果这个逻辑以后被修改了,那么之前new出来的所有对象的创建创建逻辑都会受到影响。那么将创建对象的过程统一到一些类工厂中(简单工厂模式只有

2016-12-18 23:27:37 257

原创 Chapter 0 设计模式的基础知识

1 概述所谓设计模式(Design Pattern),是前人基于以往大量的实践总结出的一系列的解决问题的方法,这些方法应用得当可以极大的提高程序的复用性和扩展性。在实际的开发中,业务代码其实并不难写,但是要让写的代码易于扩展和复用往往不是一件易事,这就要求要对业务场景进行合理的抽象,应用合适的设计模式。有个形象的比喻,写代码就像做工艺品,设计模式就像用于做工艺品的模子,要做出漂亮的工艺品就

2016-12-12 23:57:59 343

原创 Chapter 1 单例设计模式

1 概述Java中单例设计模式是一种常见的设计模式,单例模式确保某个类在内存中只有一个实例。单例设计模式的应用在计算机系统中非常常见,例如,缓存、日志、线程池等都经常应用到该模式。在spring框架中,默认的bean的注入方式是单例式的,这样可以保证用户在引用bean的对象时不会重复的生成实例。单例设计模式一般有以下特点:(1)单例类的内部会生成唯一的对象;(2)用户无法在类的外部

2016-12-06 00:10:32 316

原创 Chapter 1 Python交互模式下方向键乱码

问题描述:在Mac的terminal中,输入python进入Python的交互模式,按方向键(上下左右)时(如输入了括号后需要按左键进入括号中)出现乱码。解决方法:网上说的原因是readline库出了问题,需要重装该库,可是在Mac系统中用brew install的方法发现装不了。正确的解决方式是,输入:brew upgrade python,readline库会自动重装。之后Pyth

2016-12-03 20:13:33 1101

原创 Chapter 12 CopyOnWriteArrayList原理分析

1 概述JDK1.5的j.u.c库中提供了Copy-On-Write机制,简称为COW。其实现的基本思想是,开始的时候只有一份内容,当某个线程想要修改这个内容的时候,会将其拷贝出去形成一份新的内容,在这份新的内容上进行修改,这是一种延时懒惰策略。用该机制形成的有两个并发容器,即CopyOnWriteArrayList和CopyOnWriteArraySet。其中,后者是基于前者实现的,当进

2016-12-03 19:55:24 294

原创 Chapter 11 浅析Exchanger类

1 概述Exchanger类是java的j.u.c包中的同步辅助类,它特定作用于两个线程。这两个线程可以交换对象的同步点,在进入exchange方法时线程给出某个对象,并接受另外一个线程返回时给出的对象。和CyclicBarrier类相似的是,它们都是用来同步线程,使其动作的节奏一致,即都干完了某些事才能干下一件事。但是不同的是,Exchanger类只作用于两个线程,并且在调用阻塞方法ex

2016-11-20 15:20:21 263

原创 Chapter 1 用Vim配置Python IDE

1 概述在mac系统上,有很多工具可以作为python的开发环境,比如Sublime Text。但是作为程序员有很大一部分时间是花在终端上,我们经常用Vim编辑文本,它的优点是无处不在,速度快,从不崩溃。而且它能被打造成Python的IDE,这样我们在写脚本程序的时候就不需要切换到别的软件上去了,能提高工作效率。下面简单介绍将Vim配置成Python IDE的基本过程。2 杀手级插

2016-11-17 00:25:12 317

原创 Chapter 10 浅析Semaphore类

1 概况信号量是操作系统中很重要的一个概论,在Java中,可以通过j.u.c库中的Semaphore这个类很轻松完成对信号量的控制。通常,Semaphore类可以用来控制某个资源可被同时访问的个数,例如可以控制某个共享文件同时被多少个客户端访问。这里用网上烂大街的例子来解释一个Seamphore类的用途。例如有个卫生间,有4个坑位,有8个人排队上卫生间。那么最多同时有4个人可以同时

2016-11-12 18:34:56 303

原创 Chapter 9 浅析CyclicBarrier类

1 概述和CountDownLatch类相似,CyclicBarrier类是Java的j.u.c包中的一个线程同步的辅助类,其主要功能是让一组线程互相等待,直到抵达某个公共屏障点,这个障碍点(即barrier)也可以称为同步点。由于这个barrier在释放等待线程后可以被重用,因此被称为循环的,即cyclic。2 典型应用CyclicBarrier类的典型应用场景是这样的:

2016-11-06 16:04:34 204

原创 Chapter 3 解决Swarm管理Docker集群节点状态一直pending的问题

1 问题概述在利用Swarm管理Docker集群时,很容易安装Swarm并将节点链接起来。但是,在集群中试图运行容器时,发现没有“健康”(healthy)的节点,导致容器无法再集群中运行。使用docker -H 10.4.230.62:2376 info命令(10.4.230.62是manage节点的ip)查看集群的节点状态,输出类似下图的信息 Chapter 4 Swarm管理D

2016-11-05 00:53:14 7545

原创 Chapter 2 Swarm管理Docker集群

1 概述Docker Swarm是Docker公司在2014年初发布的一套管理Docker集群的工具,其可将一群Docker宿主机集群成一个单一、虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问接口,各种形式的Docker工具和指令都能很容易与其集成。但是,和Google的Kubernetes相比,其功能较少,在生产环境中的应用也较少。Docker Swarm

2016-10-30 16:58:20 450

原创 Chapter 8 浅析CountDownLatch类

1 概述CountDownLatch类是Java的j.u.c包中的一个线程同步的辅助类,顾名思义,它可以看成一个倒计时计数器。其主要功能是让某个(或某些)线程等待另外某个(或某些)线程执行结束才接着执行。通过构造函数传入一个指定数值给CountDownLatch对象,通过调用其await方法可以使线程会陷入等待之中,直到这个CountDownLatch对象的countDown方法被调用的次

2016-10-30 15:00:20 221

原创 Chapter 3 装饰设计模式与Java IO

1 概述装饰设计模式属于23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰设计模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰设计模式在Java中最经典的实践莫过于对Java IO库的设计。通过装饰设计模式在不使用继承关系的前提下,动态的给IO流对象提供加强的功能,其中常

2016-10-22 21:58:19 281

原创 Chapter 1 Centos安装mysql

检测系统是否自带安装mysql:yum list installed | grep mysql如果安装了卸载mysql及其依赖:yum -y remove mysql-libs.x86_64给CentOS添加rpm源,并且选择较新的源命令:wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpmyum local

2016-10-21 11:23:04 216

原创 Chapter 1 在Docker中创建Mysql容器

1 创建自己的centos镜像docker run -it centos:6.7docker commit -m="add test" -a="Fubin He" 980e0e4c79ec centos:my2 创建一个mysql目录,并在目录下创建一个Dockerfile,文件内容如下:FROM centos:my

2016-10-17 23:42:38 228

原创 Chapter 2 字符文件操作

1 背景字符文件是很普遍的文件类型,如txt文件,ini文件等,对字符文件的操作是Java IO很基础也很重要的一部分。字符文件的读写分别用到FileReader和FileWriter两个类,下面分别从这两个类出发,掌握Java IO对字符文件的操作原理和流程。2 读操作2.1 FileReader类FileReader类是读取字符文件的核心类,该类的类签名为:pu

2016-10-17 23:23:23 223

原创 Chapter 1 初窥Java IO类结构

1 背景I/O问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动。这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 。而I/O涉及到的问题比较庞杂,包括:文件、磁盘、网络、字符编码等。Java IO在java.io包下面大约有80个相关的操作类,并且其设计十分精巧,用到了设计模式中的装

2016-10-14 23:56:49 202

原创 Chapter 7 生产者消费者之ArrayBlockingQueue实现

1 背景在Java1.5中提供了很多并发类,其中ArrayBlockingQueue就是其中的一个。ArrayBlockingQueue为BlockingQueue的实现类,常用的阻塞队列。使用这个类能很方便的实现生产者和消费者的经典模式。其提供的阻塞式方法put与take能屏弊同步的细节。并且,在前面的几篇wiki当中都是默认实现生产单个商品的,如果需要实现生产多个商品(即容许商品堆积)

2016-10-09 23:50:46 258

原创 Chapter 6 生产者消费者之Condition实现

1 背景在上一篇blog:Chapter 5 生产者消费者系列之传统实现中介绍了一下传统方式实现生产者消费者的原理。通过wait/notifyAll的方式,实现多个生产者和消费者线程之间的通信,然而这种方式比较“浅层”,会造成资源上的浪费。通过Condtion对象,能更有针对性的唤醒线程。具体的方式是,在同一把锁上绑定两个Condition对象,分别对应生产者和消费者,唤醒时通过Condi

2016-10-09 23:48:46 303

原创 Chapter 5 生产者消费者系列之传统实现

1 背景线程间通信是多线程十分重要的一个知识点,Java多线程是用基于wait/notify的等待/通知模式实现的。其一个经典的案例就是“生产者消费者模式”。其中,生产者负责生产商品,消费者负责消费商品。在没有商品时,消费者必须等待生产者生产;而在已经有商品时,生产者必须等待消费者消费完才能继续消费。当然,还有“变种”模式,就是生产者可以生产商品堆积,但是堆积的数目不能超过一定的数目。可是

2016-10-09 23:42:22 175

原创 Chapter 4 suspend和resume方法

1 暂停和恢复线程在Java并发中可以使用suspend方法和resume方法分别来暂停和恢复线程的执行。虽然这两个已经被弃用了,但是有必要探究一下它们为什么被抛弃。2 使用样例参考下面的简单的案例和结果的截图可以大致了解这两个方法的使用方法,这里不多做解释。/** * Created by fubinhe on 16/9/28. */public class

2016-10-09 23:35:57 343

原创 Chapter 3 Vector类还需要同步吗

1 背景1.1 Vector与ArrayListVector和ArrayList同样是用来存储数量可变的对象的容器,其二者用法相似,但是也有一些不同点。其中一个重要的不同是,Vector是线程安全的,它的方法如add,get等都是被synchronize关键字修饰的,而ArrayList没有。类似的情形也出现在HashTable与HashMap两个类的对比上。1.2 绝对的

2016-10-09 23:30:57 305

原创 Chapter 2 验证synchronize同步函数时加的锁

1 背景介绍当多个线程访问同一资源时,需要用关键字synchronize进行同步。这时,用两种同步的方式,即同步代码块和同步函数。其中,使用同步代码块时必须指定用来同步的对象,也就是所加的锁。而使用同步函数时,只需要加synchronize写在权限修饰符之后就可以而不需要明确的指定用来同步的对象。那么,使用同步函数时所加的锁到底是什么呢,即用来同步的对象是什么呢?2 普通函数

2016-10-09 23:25:44 333

原创 Chapter 1 创建线程的两种方式

1 基本概念进程:进程是操作系统结构的基础,是一个正在执行的程序,是可以分配给处理器并由其执行的一个实体。线程:线程是进程中独立运行的子任务,是操作系统能够进行运算调度的最小单位。多线程:程序在同一时间内运行多种任务,由于CPU在这些任务之间的切换十分的快,使得用户觉得这些任务就是在同时运行,使用多线程可以大大提升系统的运行效率。2 Java创建线程的两种方式

2016-10-09 23:21:33 254

原创 Chapter 6 正则表达式在Java中的应用

1 背景 众所周知,在程序开发中,经常需要对字符串进行匹配、切割、替换、获取等操作,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。利用正则表达式就可以大大提高编程的效率,并且正则表达式和主流的编程语言如C,Java,Python,Perl等都有很好的结合。自从Java1.4推出regex包,就为我们提供了很好的JAVA正则表达式应用平台。下面从正则表达式对字

2016-10-08 23:04:28 325

原创 Chapter 5 回溯引用

1 背景在正则表达式中,往往前后匹配的模式存在一定的关系,比如后面匹配的和前面的部分要求保持一致,这个时候就需要用到回溯引用了。回溯引用的具体定义是指模式的后半部分引用在前半部分中定义的子表达式。2 经典案例2.1 引子为了更好的理解回溯引用的作用,这里引用一个经典的案例。HTML程序员经常使用标题标签(到以及配对的结束标签)来定义和排版Web页面中的标题文字。现在

2016-10-08 23:01:36 439

原创 Chapter 4 前后查找

1 背景假设,现在有这样一个需求,需要从下面这则杂乱无章的文本(比如日志)中提出所有人的姓名,所有人的姓名以"name: "开头,逗号结尾。name: Tom, password: 123 name: Kim, password: zas345abc name: Kate, password: pp456 name: Peter, password: tgd343

2016-10-08 22:45:39 242

原创 Chapter 3 正则表达式的贪婪与懒惰

1 背景量词默认情况下是贪婪的。所谓贪婪的量词会首先匹配整个字符串,如果失败则回退一个字符后重新尝试,这个过程叫回溯。就这样不停的回溯直到找到匹配或者没有字符可尝试位置。形象的说,贪婪的量词首先一次性吃饱,然后一点点吐出来。懒惰的量词则是采用另外一种策略。它首先从目标的起始位置开始尝试匹配,每次添加一个字符直到找到一个匹配或者尝试了整个字符串为止。形象的说,懒惰的量词是一次吃一点直

2016-10-08 22:42:06 468

原创 Chapter 2 匹配边界及选择

1 匹配边界1.1 行边界有时需要匹配某段文本是否是整行匹配的,这时候需要界定行边界。我们这里可以分别用^和$字符界定一行的其实和结束。如下图的例子:如上图,匹配整行是"welcome to"开头,"."结尾的文本,其中"\."表示对"."的转义。第一行由于fsdf开头,第三行由于ok结尾都不能匹配。请注意,上图中底部的Multiline的勾选去掉。1.2

2016-10-08 22:40:55 283

原创 Chapter 1 正则表达式入门

1 正则表达式简介“正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。”                                                                                                               -------图灵奖得主Ken Thompson正则表达式最早出现于20

2016-10-07 22:02:26 412

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除