组合模式(Composite Pattern) 概念: 定义:组合模式 允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。 在日常生活中我们经常会遇到树型结构的问题,比如典型的公司管理,上司管理不同的下属,下属也可能属于某个部门的上司。 组合模式可以模糊简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 组成: Component(组合):为组合中的所有对象定义一个接口。包括组合和叶节点。 Leaf(叶节点):叶节点通过实现了 Composite 支持的操作,定义了这内元素的行为。 Composite(组件):定义组件的行为,并且组件也拥有子节点。 例子: 公司雇员例子,CEO 有雇员,雇员中有部门经理,经理地面又有雇员。 组件类: 所有的组件都必须实现该接口,然而叶节点和组合节点的角色不同,所以有些方法可能并不适合某 继续阅读 >>


王伟豪 16/05/31 15:33:20
  【Redis设计与实现】第四章 字典 【Redis设计与实现】第四章 字典 字典的实现 哈希表结 […] 继续阅读 >>


李林翰 16/05/31 12:56:50
原博地址 1.默认配置: 1>允许匿名用户和本地用户登陆。 anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或anonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。 3>本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。 write_enable=YES 4>写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。 2.配置文件格式: vsftpd.conf 的内容非常单纯,每一行即为一项设定。若是空白行或是开头为#的一行,将会被忽略。内容的格式只有一种,如下所示 option=value 要注意的是,等号两边不能加空白。 3.匿名用户(anonymous)设置 anonymous_enable=YES/NO(YES) 控制是否允许 继续阅读 >>


卢晓丹 16/05/31 08:21:52
迭代器模式(Iterator Pattern) 概念: 定义:迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 迭代器模式是一种简单常见的设计模式,在我们使用编程语言中的集合容器都会有迭代器。 组成: Aggregate(抽象聚合):共同的接口供所有的聚合使用。 ConcreteAggregate(聚合):持有一个对象的集合,并实现 createIterator 方法,返回集合的迭代器。 Iterator(抽象迭代器接口):包含所有迭代器都必须实现的方法。 ConcreteIterator(具体迭代器):实现了迭代器接口的具体迭代器。 例子: 现有两家超市,一家为水果超市,一家为零食超市。他们分别请了两位编程人员帮他们实现打印品种清单程序。结果第一家编程人员用数组集合来存储不同的水果,第二家编程人员用 ArrayList 集合来存储零食种类。如下: 物品类: public class Item { private String name; pr 继续阅读 >>


王伟豪 16/05/30 23:06:06
程序多语言实际就是在不同的地区根据主机不同的设定去匹配与之对应的语言环境。 要实现多语言环境首先可以通过Locale类创建一个本地语言环境对象,如下有三种方式: Locale locale = new Locale("zh", "CN"); Locale locale1 = Locale.US; Locale locale2 = Locale.getDefault(); 第一个是通过指定语言和地区指定; 第二个是通过语言代码构造语言环境 第三个是获取此JAVA虚拟机实例的当前默认语言环境 然后就是语言的自定义了 实际上这里就是通过读取不同的配置文件获取不同的语言对应的字符,因此这里就用到了ResourceBundle工具类绑定资源文件。 资源文件的命名包含了语言环境的代码,我创建了下面两个中文和英文的语言文件: IDEA直接识别不同语言环境的文件并将他们放在一起(因为它们的基本名称相同) 这里的资源文件是通过键值对的方式存储的,如下info_zh_CN.properties: username=\u7528\ 继续阅读 >>


朱新全 16/05/30 22:31:53
1.使用yum命令安装vsftpd yum install vsftpd -y 2.添加 ftp账号和目录 先检查nologin的地址,我的在 sbin/nologin 下 使用下面的命令创建用户 useradd -d /home/ftp -s /sbin/nologin yunftp 该命令指定用户/home/ftp为yunftp的家目录 修改该账户的密码 passwd yunftp usermod -g ftp yunftp 修改指定目录的权限 chown -R ftp.yunftp /home/ftp 3.配置vsftpd 编辑vsftpd.conf文件 vim /etc/vsftpd/vsftpd.conf “anonymous_enable=YES”改为“anonymous_enable=NO” 取消如下配置前的注释符号: local_enable=YES write_enable=YES chroot_local_user=YES 4.修改shell配置 vi编辑/ 继续阅读 >>


卢晓丹 16/05/30 21:32:23
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放  5、程序代码区—存放函数体的二进制代码。 例如: int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() {           int b; 栈    继续阅读 >>


冯鑫 16/05/30 21:16:12
方法一:利用二级指针申请一个二维数组。 #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态申请二维数组 int i,j; int m,n; printf("请输入行数\n"); scanf("%d",&m); printf("请输入列数\n"); scanf("%d",&n); a=(int**)malloc(sizeof(int*)*m); for(i=0;i<m;i++) a[i]=(int*)malloc(sizeof(int)*n); for(i=0;i<m;i++) for(j=0;j<n;j++) printf("%p\n",&a[i][j]); //输出每个元素地址,每行的列与列 继续阅读 >>


冯鑫 16/05/30 20:56:48
关于Python中面向对象 什么是面向对象 这可能对于很多初学者来说是个问题,关于面向对象和面向过程可以说一直是编程界的两大阵营吧,没有好与坏之分,全在于个人见解吧,但是不得不说,现在面向过程更加主流一些吧! 面向对象的语言很多,最典型应该算Java吧!而面向过程的语言也很多,代表应该就是C语言了,但同时,又有许多的语言为了照顾这两方面的人,既支持面向过程,又支持面向对象,而Python就是这种类型。 简单来说,面向过程就是在写代码的时候,注重的是实现目的的过程是什么方式的,这个过程是怎样的,通过什么样的步骤可以解决掉他。而面向对象是对整体的考虑,将万物看作类,不同的物品通过不同的类封装,一个类里面,有类自己的属性,方法等。python支持面向对象和面向过程,一般对与比较小的项目,可以使用面向过程的方法实现比较简单,而大型项目就需要定义不同的类,在每个类里面再进行具体方法的实现。 关于类与类的实例,我举个例子吧,水果和苹果的例子,水果就是一个类,而苹果就是水果的一个实例,我们在吃苹果时说是吃水果,但是我们不能只吃水果,我们吃的,一定是水果的一个实例。请 继续阅读 >>


周攀 16/05/30 16:50:43
1> define宏: (1)是在预处理阶段展开; (2)没有数据类型,不做任何类型检查; (3)可调试; (4)不分配内存,在程序中有几次替换就分配几次内存。 const常量: (1)是编译运行阶段使用; (2)有具体的数据类型,执行类型检查; (3)不能调试; (4)分配内存,对应一个内存地址,但不重复分配内存。 2> malloc分配二维数组时如果两次分配 int **a a=(int **)malloc(n*sizeof(int *)); /*第一维分配元素个数为n的指针数组, 用来存放第二维数组每行的首地址 */ for(i=0;i<n;i++) a[i]=(int *)malloc(m*sizeof(int)); //给第二维的每个数组分配m个大小的int空间 这样分配的结果会让每行的地址不连续 二维数组本质还是一维数组所以也可以一次分配 int *a a=(int *)malloc(m*n*sizeof( 继续阅读 >>


宫展京 16/05/30 14:34:14