- 博客(40)
- 收藏
- 关注
原创 策略模式
策略模式什么是策略模式在虚拟的网络世界中,购物网站往往根据不同的用户制定不同的报价策略,比如针对新用户显示一个比较优惠的价格来提高新用户的粘度,而对老用户显示一个比较高的价格来赚取更多的利润(俗称杀熟)。针对不同的用户来制定不一样的价格显然需要条件语句来做判断,但是如果将对不同用户不同的价格算法写在一个方法中就会使方法臃肿膨胀,不利于维护,而单独将不同的算法封装为一个私有方法虽然可以解决方法臃...
2019-02-23 13:02:44 195
原创 享元模式
享元模式什么是享元模式在项目开发的过程中,我们经常会遇到各种各样的池技术,比如数据库连接池、http连接池、netty连接池、redis客户端连接池、jdk线程池等等。连接池技术通过减少连接或线程的创建、关闭来节约资源提升性能。因为连接或线程都需要相关很多文件、连接资源、操作系统内核资源支持来完成构建,会消耗大量资源,并且创建、关闭会消耗应用程序大量性能。而连接池技术核心是连接或资源的复用。...
2019-02-17 16:21:08 195
原创 桥接模式
桥接模式什么是桥接模式面向对象的三大基本特征是封装、继承和多态。在刚刚接触到继承的时候感觉它即新颖又强大,所以只要可以用,就都用上继承。但事实上,很多情况用继承会带来很多麻烦。比如,对象的继承关系在编译时期就定义好了,所以无法在运行时改变从父类继承的实现。**子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。**当你需要复用子类的时候,如果继承下来的...
2019-02-14 14:10:41 172
原创 组合模式
组合模式什么是组合模式树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等。使用面向对象设计树形结构模块的时候需要考虑一个问题,树形结构从根节点向外发散的过程中有树枝节点和叶子节点,叶子节点相当于一个单独的对象,树枝节点相当于一个包含多个叶子节点的组合,而我们希望用户在使用的过程中不单可以很直观的体现出部分于整体层次结构,还希望用户可以忽略组合对象...
2019-02-13 17:45:30 233 2
原创 代理模式
代理模式什么是代理模式生活中经常遇到需要第三方介入的情景,比如:网上购物需要购物平台这样的第三方;给姑娘写情书需要她的朋友帮忙传递等等。这个第三方在软件设计里面有一个专门的名字叫做代理模式。代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。那么为什么需要一个代理对象来对实例进行代理控制呢?网络购物找到第三方做代理是因为网络商品看得见摸不到,质量得不到控制,所以需要第三方平台来...
2019-02-13 13:47:44 218
原创 装饰模式
装饰模式什么是装饰模式玩游戏的时候经常想,给我的游戏角色穿这么多衣服,带这么多饰品到底是怎么实现的,好像可以随时随地的装饰我的角色。是怎么设计这种装饰系统的呢?受到了java.io包的启发,可以使用装饰模式来实现这种效果。参考io包下的类,可以总结出一些装饰模式的条件:装饰者和被装饰者对象有相同的超类型可以用一个或多个装饰者包装一个对象既然装饰者和被装饰对象有相同的超类型,所以在任...
2019-02-05 23:14:41 137
原创 外观模式
外观模式什么是外观模式对于很多程序员来说,每天早上到办公室都有一个很繁琐很无聊的工作要做,那就是打开各种电脑软件:编程工具、通讯工具、邮箱、各种文档…这些事情没难度,但是却浪费我们的时间和经历。那我们可不可以像一个办法,一键打开所有需要用到的软件,下班的时候一键关闭呢?这个情形想起了外观模式,也可以叫做门面模式。外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口...
2019-02-05 15:13:05 243
原创 适配器模式
适配器模式什么是适配器模式网络购物让现在的商品交易消除了距离感。有时候我们会买一些国外的商品,比如日本直邮的PS4,但是有一个比较棘手的问题就是两国使用的电线插头规格是不一样的,日本直邮的PS4插头适配不了中国的插座。这时候我们需要在万能的淘宝上买一个转换头,一边可以插在中国的插座上,一边可以接受日本规格的插头,这样我们就可以愉快的打游戏了。这个转换头学名就是适配器,而这种转换的方式就叫做适配...
2019-02-05 12:16:33 215 1
原创 原型模式
原型模式什么是原型模式原型模式:当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式。原型模式是一种创建型模式,允许用户从一个样板实例中复制出一个内部属性一致的对象,俗称克隆。被复制的实例称为原型。原型模式多用在比较复杂或耗时的情况下,因为复制一个已经存在的实例可以时程序运行更高效。原型类需要具备两个前提条件:实现Cloneable接口。在Java语言中,Cloneable接口只有...
2019-02-04 15:34:23 212
原创 建造者模式
建造者模式什么是建造者模式很多人都喜欢吃麦当劳,肯德基这样的西式快餐,不单是因为方便快捷,而且不同的店做出来的味道基本差不多,满足自己的口味。但是不同的店铺,不同的厨师,做出来的食物口味相差不多,是不是有点神奇。其实明白了其中的原理,实现这样的效果还是挺简单的。要想满足食物的味道在不同人的操作下相差不大,只要对每种食物制定一套规范的工作流程,原料放多少,加热几分钟,放多少调料…不同的人按照这个...
2019-02-04 13:39:24 201
原创 单例模式
单例模式什么是单例模式有些时候某些对象我们只需要一个,比如说:线程池、缓存、对话框等等。事实上,这些对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生。为了保证对象只有一个实例,会想到全局变量,使用全局变量来保证单例时,就要在程序一开始就创建好对象。如果这个对象非常消耗资源,而程序在这次的执行过程中又没有用到他,会形成浪费。虽然全局变量是可以实现单例的需求,但是仿佛有些不完美,单...
2019-02-03 22:51:53 108
原创 抽象工厂模式
抽象工厂模式什么是抽象工厂模式在工厂方法模式中,使用一个工厂创建一个产品。但是有时候我们需要一个工厂能够提供一系列的产品对象,而不是单一的。这时候可以将工厂方法模式扩展一下,以前工厂方法抽象创建者工厂提供一个抽象方法,继承抽象创建者的具体创建者工厂继承该抽象方法,实现具体的创建细节,获取单一的产品实例。如果抽象创建者工厂提供多个抽象方法,那么继承该接口的具体创建者工厂可以实现多个产品的创建。这...
2019-02-03 22:01:14 151
原创 工厂方法模式
工厂方法模式什么是工厂方法模式设计原则中有一句话:类应该对扩展开放,对修改关闭。 对于简单工厂,是将创建产品的细节抽取封装到一个工厂类中,如果在后来的扩展中又加入了新的产品,就需要对工厂类创建产品的方法进行修改,这样就违背了开-闭原则。那么怎样设计工厂类才能使每次新增加的产品不会违背开闭原则,并且可以灵活的对系统进行扩展呢?我们需要解决以下几个问题:只能对现有的工厂类进行扩展,不能修改已...
2019-02-03 11:27:00 1656
原创 简单工厂
简单工厂什么是简单工厂**设计原则中有这样一句话:应该针对接口编程,而不是针对实现编程。**而在创建对象的时候,经常使用new关键词,这不正是在针对实现编程嘛!实例化一个具体类会导致代码更脆弱,更缺乏弹性。有些时候具体需要实现哪个类,通常在运行时由一些条件来决定,这样的代码一旦有变化或扩展,就必须重新打开这段代码进行检查和修改。通常这样修改过的代码将造成部分系统更难维护和更新,而且也更容易犯错...
2019-02-02 21:38:52 197
原创 选择排序--堆排序
选择排序的基本思想:每一趟 (例如第i趟,i = 0,1,…)在后面第n-i个待排序元素中选出最小元素作为有序序列的第i个元素,直到第n-1趟结束后,所有元素有序。在这里,我们介绍两种具体的选择排序算法:直接选择排序与堆排序。堆排序的核心是堆调整算法。首先根据初始输入数据,利用堆调整算法shiftDown()形成初始堆;然后,将堆顶元素与堆尾元素交换,缩小堆的范围并重新调整为堆,如此往复。...
2018-04-11 19:27:22 163
原创 归并排序
归并排序包含两个过程:”归”和”并”。其中,”归”是指将原序列分成半子序列,分别对子序列进行递归排序;”并”是指将排好序的各子序列合并成原序列。归并排序算法是一个典型的递归算法,因此也是概念上最为简单的排序算法。与快速排序算法相比,归并排序算法不依赖于初始序列,并且是一种稳定的排序算法,但需要与原序列一样大小的辅助存储空间。 package keking.sort;import java...
2018-04-02 21:05:41 191
原创 交换排序--快速排序
交换排序的基本思想:根据序列中两个元素的比较结果来对换这两个记录在序列中的位置,也就是说,将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小(划分过程),然后再按此方法对这两部分数据分别进行快速排序(快速排序过程),整个排序过程可以递归进行,以此达到整个数据变成有...
2018-04-01 20:45:06 196
原创 交换排序--冒泡排序
交换排序的基本思想:根据序列中两个元素的比较结果来对换这两个记录在序列中的位置,也就是说,将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 冒泡排序的思想:根据序列中两个元素的比较结果来对换这两个记录在序列中的位置,将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。因此,每一趟都将较小的元素移到前面,较大的元素自然就逐渐沉到最后面了,也就是说,最大的元素...
2018-04-01 19:06:14 205
原创 选择排序--直接选择排序
选择排序的基本思想:每一趟 (例如第i趟,i = 0,1,…)在后面第n-i个待排序元素中选出最小元素作为有序序列的第i个元素,直到第n-1趟结束后,所有元素有序。在这里,我们介绍两种具体的选择排序算法:直接选择排序与堆排序。 直接选择排序的思想:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R1~R[n-1]中选取最小值,与R1交换,….,第i次从R[i-1]~R...
2018-04-01 18:28:01 286
原创 插入排序--折半插入排序
插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入到前面已经排好序的一组元素中,直到元素全部插入为止。在这里,我们介绍三种具体的插入排序算法:直接插入排序,希尔排序与折半插入排序。折半插入排序的思想:当插入第i(i>=1)个元素时,前面的V[0],…,V[i-1]等i-1个 元素已经有序。这时,折半搜索第i个元素在前i-1个元素V[i-1],…,V[0]中的插入位置,然后直...
2018-04-01 17:59:55 369
原创 插入排序--希尔排序
插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入到前面已经排好序的一组元素中,直到元素全部插入为止。在这里,我们介绍三种具体的插入排序算法:直接插入排序,希尔排序与折半插入排序。希尔排序的思想:设待排序序列共n个元素,首先取一个整数gappackage keking.sort;import java.util.Arrays;/** * Title: 希尔排序(缩小...
2018-04-01 17:35:15 134
原创 插入排序--直接插入排序
插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入到前面已经排好序的一组元素中,直到元素全部插入为止。在这里,我们介绍三种具体的插入排序算法:直接插入排序,希尔排序与折半插入排序。 直接插入排序的思想:当插入第i(i>=1)个元素时,前面的V[0],…,V[i-1]等i-1个 元素已经有序。这时,将第i个元素与前i-1个元素V[i-1],…,V[0]依次比较,找到插入位置...
2018-04-01 16:06:47 196
原创 Redis配置
参数名称 描述 daemonize 默认情况下,redis不是在后台运行的, 如果需要在后台运行,把该项的值设置为yes pidfile 当redis在后台运行的时候, redis 默认会把pid文件放在/var/run/redis.pid, 可以配置到其他地址, 当运行多个redis服务时, 需要指定不同的pid文件和端口 bind 指定red...
2018-04-01 13:52:12 233
原创 Redis持久化
概述Redis的高性能是由于其将所有数据都储存在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式.可以单独使用其中一种或将二者结合使用.RDB持久化(默认支持,无需配置) 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.AOF持久化 该机制将以...
2018-04-01 11:38:37 172
原创 Redis的常用命令
五种数据类型string类型字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这 便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。 在Redis中字符串类型的Value最多可以容纳的数据长度是512Mset key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”...
2018-04-01 00:06:32 188
原创 Redis的安装和使用
1.什么是RedisRedis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的储存需求,目前为止Redis支持的键值数据类型如下:字符串类型散列类型列表类型集合类型 有序集合类型 注:官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s.2.Red...
2018-03-31 23:42:25 213
原创 NoSQL概述
1.什么是NoSQLNoSQL(Not Only SQL),即不仅仅是SQL,是一项全新的数据库理念,泛指非关系型数据库.2.为什么需要NoSQL对数据库高并发读写的需求对海量数据的高效率存储和访问的需求对数据库的高可扩展性和高可用性的需求3.主流NoSQL产品NoSQL数据库的四大分类如下键值存储数据库 相关产品:Redis、Riak、Simp...
2018-03-31 22:58:58 213
原创 分页标签的实现
JSP分页标签的实现:一个util类,一个pojo类,一个tld标签文件tld标签文件<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun....
2018-02-25 23:26:11 1073
原创 ssm框架搭建
- 整合思路Dao层:1、SqlMapConfig.xml 一般只配置类型别名typeAliases,用于批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以). SqlMapConfig.xml中配置的内容和顺序如下: -properties(属性) -settings(全局配置参数) -typeAliases(类型别名) -typeHandl...
2018-02-25 23:15:15 150
原创 Java Web--深入分析中文编码问题
本篇主要对javaweb请求响应编码问题的分析.服务器以Tomcat来作说明. 一.请求 1.GET请求 || ………………………………..|| Http://localhost:8080/demo/servlets/servlet/路径?name=我爱java …………………………………………..|ServletPath||PathInfo||..QueryString..| 浏览
2018-01-28 13:48:25 232
原创 基础巩固--接口
本章记录一些接口的特性. 一.接口中定义的方法被默认的标记为public,域被默认的标记为public static final 二.在JavaSE8中,允许在接口中增加静态方法.只是这有违于将接口作为抽象规范的初衷. 目前为止,通常的做法都是将静态方法放在伴随类中.在标准类库中,经常有成对出现的接口和使用工具类,如Collection/Collections,Path/Paths. 三.
2018-01-28 10:31:08 171
原创 基础巩固--内部类
一.什么是内部类可以将一个类的定义放在另一个类的内部定义,这就是内部类.public class OuterClass{ private String name; private int age; public OuterClass(){} public OuterClass(String name, int age){ this.nam
2018-01-23 01:34:41 212
原创 基础巩固--堆栈轨迹
堆栈轨迹(stack trace)是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。 可以调用Throwable类的printStackTrace方法访问堆栈轨迹的文本描述信息。Throwable t = new Throwable();StringWriter out = new StringWriter();t.printStackTrace(new PrintWrite
2017-11-23 21:27:55 815
原创 基础巩固--异常
Java语言规范讲派生于Error类或RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常。 一个方法必须声明所有可能抛出的受查异常,二非受查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误消息。 注意:如果在子类中覆盖了超类的一个方法,子类方法中声明的受查异常不
2017-11-23 20:49:38 280
转载 基础巩固--重载与覆盖
重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。这里有两个问题需要注意:(1) 什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同。(2) 重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自
2017-11-22 11:42:34 194
原创 基础巩固--接口基本特性
接口中可以包含方法和常量。但绝不能包含实例域。 接口中所有的方法自动的属于public。因此,在接口中声明方法时,不必提供关键字public。 接口中的域将被自动的设置为public static final。在Java SE8中,允许在接口中增加静态方法。只是这有违于将接口作为抽象规范的初衷。通常的做法是将静态方法放在伴随类中,如Collection/Collections,Path/Path
2017-11-22 10:56:19 263
原创 基础巩固--hashCode方法
散列码是由对象导出的一个整型值。散列码是没有规律的。 如果重新定义equals方法,就必须重新定义hashCode方法,以便用户可以讲对象插入到散列表中。 equals与hashCode的定义必须一致:如果x.equals(y)返回true,那么x.hashCode()就必须与y.hashCode()具有相同的值。例如,如果用定义Employee.equals比较雇员的ID,那么hashCode
2017-11-21 19:00:41 234
原创 基础巩固--编写一个完美的equals方法
显示的参数命名为otherObject。 1,检测this与otherObject是否引用同一个对象:if(this == otherObject) return true;2,检测otherObject是否为null:if(otherObject == null) return false;3,比较this与otherObject是否属于一个类。 如果equals的语义在每个子类中有所改变,就
2017-11-21 01:10:15 238
原创 基础巩固--理解方法调用
假设要调用x.f(param),隐式参数x声明为类C的一个对象。 1,编译器查看对象的声明类型和方法名。假设调用x.f(param),且隐式参数声明为C类的对象。需要注意的是:有可能存在多个名字为f,但参数类型不一样的方法。编译器将会一一列举所有C类中名为f的方法和其超类中访问属性为public且名为f的方法。 至此,编译器已获得所有可能被调用的候选方法。 2,接下来,编译器将查看调用方法时提
2017-11-20 23:45:54 235
原创 基础巩固--方法参数
设计语言中将参数传递给方法的术语: 1,按值调用–表示方法接受的是调用者提供的值; 2,按引用调用–表示方法接受的是调用者提供的变量地址。JAVA程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值得一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。方法参数类型: 一,基本数据类型public class Args { static int count = 10;
2017-11-20 21:51:17 344
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人