12.设计模式-外观模式
七八个星天外,两三点雨山前。
——辛弃疾《西江月》
## 设计模式-外观模式
1. 案例引出外观模式
影院管理项目,组建一个家庭影院其中包括DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:
直接用遥控器:统筹各设备开关
开爆米花机Popcorn
放下屏幕Screen
开投影仪Projector
开音响Stereo
开 DVD,选 DVD
去拿爆米花
调暗灯光TheaterLight
播放
观影结束后,关闭各种设备
传统方式解决影院管理
然后再关闭各种设备就完成了,其中的很明显调用的方法太多,我们不方便调用。
传统方式解决影院管理问题分析
在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程
不利于在 ClientTest 中,去维护对子系统的操作
解决思路: 定义一个高层接口,给 子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready, play, pause, end ),用来访问子系统中的一群接口。也就是说就是通过定 ...
13.页面静态化技术Freemarker
[toc]
网页静态化技术Freemarker
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
1. 网页静态化技术使用场景 网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(Search Engine Optimization)。另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有三百到五百。
2. 页面静态化技术Freemarker入门Demo2.1 引入依赖1234567891011121314151617181920212223242526272829303132333435363738 //to ...
13.MySql高级之并发参数调整
零落成泥碾作尘,只有香如故。
——陆游《卜算子》
MySql高级之并发参数调整从实现上来说,MySQL Server 是多线程结构,包括后台线程和客户服务线程。多线程可以有效利用服务器资源,提高数据库的并发性能。在Mysql中,控制并发连接和线程的主要参数包括 max_connections、back_log、thread_cache_size、table_open_cahce。
1. max_connections
采用max_connections 控制允许连接到MySQL数据库的最大数量,默认值是 151。如果状态变量 connection_errors_max_connections 不为零,并且一直增长,则说明不断有连接请求因数据库连接数已达到允许最大值而失败,这是可以考虑增大max_connections 的值。
Mysql 最大可支持的连接数,取决于很多因素,包括给定操作系统平台的线程库的质量、内存大小、每个连接的负荷、CPU的处理速度,期望的响应时间等。在Linux 平台下,性能好的服务器,支持 500-1000 个连接不是难事,需要根据服务器性能进行评估设定。
...
13.数据结构之基数排序
排序算法之基数排序1. 基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法。
基数排序(Radix Sort)是桶排序的扩展。
基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。
1.1基数排序基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
1.1.1 基数排序图文说明
将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序
1.2 代码实现1234567891011121314151617181920212223242526272829303132333435363738 ...
13.设计模式-享元模
花城人去今萧索,春梦绕胡沙。
——赵佶《眼儿媚》
设计模式-享元模式1. 享元模式概述1.1 享元模式是什么?
享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术(共享对象的方式)有效地支持大量细粒度的对象。
细粒度对象(可以理解为不使用线程池情况下的线程对象) : 是内存中的数量庞大的对象 ,实际使用的数量庞大的对象 ;
共享对象(可以理解为线程池中的对象) :
多个细粒度对象共享的部分数据 ;
对象缓存池中存储的对象 ;
1.2 享元模式何时使用?
系统中有大量对象。
这些对象消耗大量内存。
这些对象的状态大部分可以外部化。
这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
系统不依赖于这些对象身份,这些对象是不可分辨的。
1.3 享元模式应用场景?
常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面 ...
13.面向对象特性之多态
梧桐落。又还秋色,又还寂寞。
——李清照《忆秦娥》
## 1. 面向对象特性之多态
定义:同一个行为,具有不同的多种表现形式 。
多态是继封装、继承之后,面向对象的第三大特性。使用多态的前提条件有以下几条:
继承或者实现【二选一】(接口和抽象类)
方法的重写【意义体现:不重写,无意义】
父类引用指向子类对象【格式体现】
1.1 多态的具体使用1234567891011121314151617181920212223242526/** * java编程思想中: * * 针对行为 * 多态分成 * 前期绑定:编译时绑定,绑定是父类。 * 后期绑定:运行时绑定,绑定的是子类。 * * 针对属性 * 不管是编译期间还是运行期间,他都认为自己是父类。 * * * 在使用多态的时候,注意点: * 子类中有,但是父类中没有的方法,使用多态无法调用。 * * 父类中有但是子类中没有的方法,使用多态是可以调用的。 * * * 使用多态调用子类的属性: * 1.直接调用:无法实现: * 2. ...
14.内部类、包装类和权限修饰符总结
洞房记得初相遇。便只合、长相聚。何期小会幽欢,变作离情别绪。
——柳永《昼夜乐》
## 1. 内部类
1.1 成员内部类12345678910111213141516171819202122232425262728293031323334public class Demo01 { public static void main(String[] args) { Body body = new Body(); // 如果外部类以外的地方使用内部类,需要先创建外部类的对象 然后在创建内部类的对象。 // Body.Heart heart = new Body().new Heart(); Body.Heart heart = body.new Heart(); heart.beat(); // 底层实现是使用内部类Node内部类,作用是只在其外部类中使用 LinkedList list = new LinkedList(); } ...
14.排序算法小结
1. 排序算法的比较图
2.相关术语解释
稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面;
不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面;
内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度: 一个算法执行所耗费的时间。
空间复杂度:运行完一个程序所需内存的大小。
n: 数据规模
k: “桶”的个数
In-place: 不占用额外内存
Out-place: 占用额外内存
14.设计模式-代理模式
便作春江都是泪,流不尽,许多愁。
——秦观《江城子》
设计模式-代理模式
代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是–可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
代理模式主要有三种
静态代理
动态代理 (JDK 代理--接口代理)
动态代理Cglib 代理 (可以在内存动态的创建对象,而不需要实现接口)。
1. 静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。
1.1 引出静态代理模式
定义一个接口 ITeacherDao
目标对象 TeacherDAO 实现接口 ITeacherDAO
使用静态代理方式,就需要在代理对象 TeacherDAOProxy 中也实现 ITeacherDAO
调用的时候通过调用代理对象的方法来调用目标对象。
特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。
1.2 ...
15.JDK8新特性--Optional
江头未是风波恶,别有人间行路难!
——辛弃疾《鹧鸪天》
## JDK8新特性--Optional
1. Optional简介
到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为JDK8类库的一部分。
Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。==并且可以避免空指针异常。==
Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
2. Optional常用方法
Optional提供很多有用的方法,这样我们就不用显式 ...