java-设计模式
Java 常见设计模式
设计模式(Design pattern) 代表了最佳实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式简要说明
本次示例 主要介绍一下模式
中介模式
代理模式
责任链模式
中介模式简介
定义一个对象,该对象封装了一组对象的交互方式。对象之间的通信将封装在中介对象中。对象不再直接相互通信而是通过中介进行通信。这减少了通信对象之间的依赖性,从而减少了耦合。
优点
避免一组交互对象之间的紧密耦合
可以独立地改变一组对象之间的交互
类图
示例代码比如 我们要实现一个聊天室 聊天室就是中介,聊天的人就是一个同事类,发送的消息都由聊天室转发给别人
首先我们新建一个聊天室文件
123public abstract class AbstractChatRoom { public abstract void notice(String message, User user);}
然后我们新建 ...
关于 Java 多线程
java 多线程 Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。本节主要讲解 Java 多线程的一些概念以及其实现。
多线程
线程变量
线程同步
Lock 与 Unlock
死锁
线程生命周期
ArrayBlockingQueue
生产者消费者模式
线程池
线程:程序执行流的最小单元。它是进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派 CPU 的基本单位。
如同大自然中的万物,线程也有“生老病死”的过程,下图表示了一个线程从创建到消亡的过程,以及过程中的状态。
结合线程的生命周期来看看多线程的定义:
多线程:从软件或者硬件上实现多个线程并发执行的技术。在单个程序中同时运行多个线程完成不同的工作。
在 Java 中,垃圾回收机制就是通过一个线程在后台实现的,这样做的好处在于:开发者通常不需要为内存管理投入太多的精力。反映到我们现实生 ...
关于 Java Socket 的使用
Java Socket
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节
TCP
UDP
HttpURLConnection
InetAddress
Socket
ServerSocket
Socket 简介(摘抄网络)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 socket 建立网络通信连接至少要一对端口号(socket)。socket 本质是编程接口(API),对 TCP/IP 的封装,TCP/IP 也要提供可供程序员做网络开发所用的接口,这就是 Socket 编程接口HTTP 是轿车,提供了封装或者显示数据的具体形式Socket 是发动机,提供了网络通信的能力Socket 的英文原义是“孔”或“插座”。作为 BSD UNIX 的进程通信机制,取后一种意思。通常也称作”套接字”,用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不 ...
关于 Java Set、HashSet 的使用
Set 和 HashSetSet 接口也是 Collection 接口的子接口, 它有一个很重要也是很常用的实现类—-HashSet.Set 是元素无需并且不包含重复元素的Collection(List可以重复), 被称为集
HashSet 由哈希表(实际上是一个HashMap实例)支持. 它不保证set的迭代顺序; 特别是它不保证该顺序恒久不变
示例代码:
假设现在学生们要做项目,每个项目有一个组长,由组长来组织组员,我们便来实现项目组的管理吧。
12345678910111213141516171819// PD.javaimport java.util.HashSet;import java.util.Set;/* * 项目组长类 */public class PD { public String id; public String name; //集合后面的<>代表泛型的意思 //泛型是规定了集合元素的类型 public Set<Student> students; public PD(Strin ...
关于 Java Map 的使用
java MapMap 接口也是一个非常重要的集合接口, 用于存储键/值对.Map 中的元素都是成对出现的,键值对就想数组的索引与数组的内容关系一样, 将一个键映射到一个值的对象.一个映射不能包含重复的键;每个键最多只能映射到一个值.我们可以通过键去找到相应的值.
1key =>(映射) value
value 可以存储任意类型的对象,我们可以根据key键快速查找value.Map 中的键/值对以Entry类型的对象实例形式存在.
Map 方法:
方法
返回值
说明
clear()
void
从此映射中一处所用映射关系(可选操作)
containsKey(Object key)
boolean
如果此映射包含指定键的映射关系,则返回 true
containsValue(Object value)
boolean
如果此映射将一个或多个映射到指定值,则返回true
entrySet()
Set<Map.Entry<K,V>>
返回此映射中包含的映射关系的Set视图
equals(Object o)
boolean
比较 ...
关于 Java JDBC 的使用
Java JDBC
JDBC 是连接数据库和Java程序的桥梁,通过JDBC API 可以方便地实现对各种主流数据库的操作. 本节将重点讲解JDBC的内容
本章概括:
SQL 简介
JDBC
创建数据库
数据库操作
JDBC 结果集
插入数据
小提示 在已经掌握了 关系数据库 和 非关系数据库的小伙伴 可以进行适当跳章
数据库简介数据库,简而言之可以理解成电子化的文件柜–存储点子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作
所谓”数据库”系以一定方式存储在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。一个数据库由多个表空间(Tablespace)构成.
常见的关系型数据库有以下几种:
Mysql
MariaDB
Percona Server
PostgreSQL
Microsoft Access
Microsoft SQL Server
Google Fusion Tables
FileMaker
Oracle
Sybase
dBASE
Clipper
F ...
关于 Java System、Random 的使用
java 关于 System、Random 的使用
记录java的System、Random 类的使用
SystemSystem 类提供一下的功能:
标准输入,标准输出和错误输出流
访问外部定义的属性和环境变量
加载文件和库的方法
以及用于快速复制数组的实用方法。
System 不可以被实例化,只能使用其静态方法
123456789101112//从指定的源数组中复制一个数组,从源数组指定的位置开始,到目标数组指定的位置public static void arraycopy(Object src,int srcPos, Object dest,int desPos,int length) //返回以毫秒为单位的当前时间(从1970年到现在的毫秒数)public static long currentTimeMillis() //终止当前正在运行的Java虚拟机,status为 0时退出public static void exit(int status) // 运行垃圾收集器public static void gc() // 取得当前系统的全部属性public st ...
程序员常用算法
算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间、空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度于时间复杂度来衡量—-维基百科
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序时间复杂度为 O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。插入排序的基本思想是:每步将一个待排序的记录按其关 ...
关于java Arrays、StringBuilder 类的使用
关于java Arrays、StringBuilder 类的使用
记录 java Arrays、StringBuilder 两个类的使用方法
Arrays
Arrays 类包含用于操作数组的各种方法(例如排序和搜索)。还包含一个静态工厂,允许将数组转为list
方法
描述
List asList(T…a)
返回由指定数组构造的list
void sort(Object[] a)
对数组进行排序
void fill(Object[] a, Object val)
对数组的所有元素都赋上相同的值
boolean equals(Object[] a, Object[] a2)
检查两个数组是否相等
int binarySearch(Object[] a, Object key)
对排序后的数组使用二分法查找数据
示例代码:
12345678910111213141516171819202122232425262728293031import java.util.Arrays;import java.util.Random;public class Ar ...
关于 java ArrayList
ArrayList 类的使用示例List是一个借口,不能实例化,需要一个具体类来实现实例化.List集合中的对象按照一定的顺序排放,里面的内容可以重复.List借口实现的类有:ArrayList(实现动态数组),Vector(实现动态数组),LinkedList(实现链表),Stack(实现堆栈).
List在Collection基础上增加的方法:
方法
返回值
说明
add(int index, E element)
void
在列表的指定位置插入指定元素(可选操作)
addAll(int index, Collection<? extends E> c)
boolean
将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)
get(int index)
E
返回列表中指定位置的元素
indexOf(Object o)
int
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
lastIndexOf(Object o)
int
返回此列表中最后出现的指定元素的索引;如果列表不包含此元 ...
Nginx配置文件详细说明
关于nginx相关配置
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.
#运行用户
user www-data;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
#工作模式及连接数上限
events {
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024;#单个后台worker process进程的最大并发链接数
# multi_accept on;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
...
关于推荐大家建立个人博客
关于博客 关于博客 说实在的 很多朋友都在问我 为什么要做一个博客 其实对于每一个程序员来说 个人博客就好像是一个人的身份标识一样
当然 更多的是一个人的编程思想 也是一种隔着屏幕的文化交流 同时也是一场知识竞赛 对于我们来说 其实也有很多人 会用印象笔记那样的东西
这些都是一种记录方式 而我们制作博客 将文章放在博文上面 同时也是为了帮助别人
博客的好处
没有什么是没有意义的 今天你学习的一小部分 积少成多 终会成为你未来前进道路上的助力
其实对于博客来说的话 有很多种方式可以证明博文是好的 例如记录自己的学习过程 记录自己踩过的坑 当然 你可以说 (我自己用印象笔记**)都可以记录呀 为什么还要花钱租借服务器去搭建博客这种东西 其实在这里 我就要说一句了
其实吧 将文章放在网络上不仅仅可以和各位大佬交流 同时呢也可以帮助到其他人 甚至你的个人博客站点流量高了之后 大家可以申请百度谷歌的广告联盟 这些还能帮助我们盈利 不仅在学习的过程中我们还可以利用知识赚钱(我真是太贼了୧(๑•̀⌄•́๑)૭)) 当然这些都不是最主要的问题
还能提高我们的文笔 更多的是一 ...
简单工厂模式(Simple Factory Pattern)
简单工厂模式(Simple Factory Pattern)1.1 模式动机考虑到一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如 圆形按钮、棱角按钮、矩形按钮),这些按钮都来源同一个基类,不过在基础基类之后不同的子类修改了部分属性从而使得他们能够呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道哪些具体的按钮的名字,只需要知道表示这个按钮的一个参数,并提供一个调用方便的方法,把该参数传入方法并返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
1.2 模式定义简单工厂模式(Simple Factory Pattern): 又称之为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.3 模式结构简单工厂模式包含如下角色:
Factory:工厂角色 工厂角色负责实现创建所有实例的内部逻辑
Product:抽象产品角色 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的 ...
lumen + dingo 搭建api服务器
lumen + dingo 搭建api服务器网上现在关于lumen的教程还是蛮少的,不过很少有初级PHP人员直接接触lumen,估计这也是一个问题吧!作为一个菜鸟,因为公司项目重构,所以我走上了lumen的流行
lumen lumen git地址 全部关于lumen的介绍以及说明都有
至于 dingo/api 是一个基于larveral和lumen的api工具 可以帮助我们快速构建api服务
dingo/api dingo/api git地址 全部关于dingo组件
安装首先 ,通过使用composer安装laravel安装器:
1composer global require "laravel/lumen-installer"
然后我们通过安装器进行安装
1lumen new blog
其次我们也可以通过composer创建项目
1composer create-project --prefer-dist laravel/lumen blog
本地开发环境如果你本地安装了PHP,并且你想使用PHP内置的服务器来为你提供应用服务,php -S ...
mysql FIND_IN_SET使用方法
mysql FIND_IN_SET使用方法使用场景在最近的一次项目中,遇到一个场景,在一个审批中可能存在两个人同时进行审批,按照原先项目的思路,我决定对该项目的字段进行修改
首先在原有字段上进行修改
原有字段存在单个人的id 我们在单个id时对该id进行存储 然后 用户登录时,我们获取用户的id 然后对该id 进行验证
对此进行修改 我直接将原有的bigint类型修改成为varchar字段
如 原字段 存储用户1 = id = 1现在字段 存储 用户1 = id = 1 多用户 用户1、用户2 = id = 1,2
问题概述问题出现在id如果是按照in去查询 那么我们永远只能查询到id在前的无法查询到第一个id 后面的id
百度了一下 在mysql的手册中找到了FIND_IN_SET() 方法
使用方法语法1FIND_IN_SET(str,strlist)
定义
假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在1到N之间。
一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。
如果第一个参数是一个常数字符串,而第二个是typeSE ...