- 博客(33)
- 收藏
- 关注
原创 备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。类图:发起人(游戏角色)public class GameRole { private int vit; private int atk; private int def; public void stateDisplay() { Sy
2017-12-20 10:52:12
296
原创 适配器模式
维基百科在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。球员抽象类public abstract class Player { protected String name; public Pl
2017-12-07 10:13:37
2335
原创 建造者模式(生成器模式)
维基百科生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。抽象创建接口public interface PersonBuilder { void buildHead(); void buildBody(); void b
2017-12-06 09:53:21
470
原创 外观模式
百度百科外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。public class Debt { public void buy() { System.out.println("买国债"); } public void sell() { System.out.println("卖
2017-12-06 09:20:22
288
原创 模板方法模式
维基百科模板方法模式定义了一个演算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变演算法架构的情况下,重新定义演算法中的某些步骤。具体来说,模板方法就是提炼出公共的方法步骤,子类只需要关系自己要做的事即可。试卷模板public abstract class Question { //题目,不允许子类修改 public final void question1()
2017-12-05 16:55:28
227
原创 工厂模式
维基百科工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”操作对象public class Operation { private
2017-12-05 15:20:55
681
原创 代理模式
百度百科代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。真实角色:实现抽象角色,定义真实角色所要实现的业务逻
2017-12-05 11:15:17
221
原创 装饰模式
百度百科装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。在装饰模式中的各个角色有:抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
2017-12-04 17:38:11
300
原创 策略模式
维基百科:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 策略模式:定义了一族算法(业务规则);封装了每个算法;这族的算法可互换代替(interchangeable)。定义统一策略接口public interface CashSuper {
2017-12-04 14:09:58
211
原创 归并排序
今天又重新学习了归并排序,感觉跟从来没有看过一样,老了,记性就是不好了。学习算法最重要的就是学习算法的思想,归并采用的是分治、合并的思想,既是把要排序的列表分解成小的待排序的列表,把小的列表排序之后再归并到一起。如要对{6,5,9,14,46,7,10}进行排序,把它分解成{6,5,9,14}和{46,7,10}分别进行排序,然后把{6,5,9,14}分解成{6,5}和{9,14}进行排序,依次类推
2017-11-21 22:01:23
273
原创 堆排序
最近在学习算法,学习过不久之后总会忘得一干二净,但是算法对程序员又很重要,也不得不学啊!昨天重新学习了堆排序,今天花时间重新整理一下思路。预备知识 堆排序是通过二叉堆实现的,堆是一颗被完全填满的二叉树,例如下图是一颗完全二叉树。 如果把所有的元素放到数组中: 如果把某个根节点的下标设为i,那么它的左子节点的下标的2i+1,右子节点的下标的2i。这个规律是进行堆操作的基础
2017-11-16 21:53:58
321
原创 杨氏矩阵查找算法
今天再牛客上看到一个算法题。 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下图中要查找 8。如果存在返回true,如果要查找30,则返回false。 查询的思路就是直接定位到第一行的最右边的元素(5),如果要查找的元素比5小,则左移,如果比5大则下移,反复执行,直到查
2017-11-10 11:04:48
430
原创 观察者模式
Observable是java实现观察者模式的一种方式,被观察者需要继承Observable,观察者实现Observer接口。被观察者//学生,被观察者,继承Observable(可以被观察的)public class Student extends Observable { public void study(){ System.out.println("学生:1+1=几"
2017-08-02 10:57:33
305
原创 Buffer
Buffer是java.nio包下的一个抽象方法。提供了对I/O的高速操作。 Buffer主要有两种操作模式,读模式和写模式。 内部通过几个变量,对buffer进行操作。//变量所表示的意义在不同操作中也不同// Invariants: mark <= position <= limit <= capacityprivate int mark = -1;private int positi
2017-08-01 16:41:36
540
原创 Set
一开始有看源码的时候,最先看的是set,点进源码之后才看到,set内部是用map实现的,花了几天时间看了集中map源码,看完之后也会忘,但是还是有很大收获,读源码的道路还是要继续下去。 HashSet HashSet继承了AbstractSet,实现了Set、Cloneable、Serializable接口。 HashSet内部的实现方式是HashMap public HashSet()
2017-07-19 21:01:42
311
原创 ConcurrentHashMap
ConcurrentHashMap继承了AbstractMap,实现了AbstractMap和Serializable接口。 ConcurrentHashMap是支持高并发的hashMap。 //节点信息保存了对应的hash值、key、value,及下一节点信息,但是value和下一节点信息用volatile 修饰,保证可见性。 static class Node<K,V> impl
2017-07-17 17:52:48
381
原创 IdentityHashMap
IdentityHashMap继承了AbstractMap,实现了Map, java.io.Serializable, Cloneable接口。IdentityHashMap是一个比较奇葩的hashMap,为什么这么说呢,因为它和别的HashMap有很大区别。和其它HashMap相比,IdentityHashMap并没有使用hash桶链表等结构存储内部数据,而是只使用了数组来存储数据。transie
2017-07-16 17:04:38
528
原创 LinkedHashMap
LinkedHashMap继承自HashMap,实现了Map接口。LinkedHashMap保持了内部数据为插入的顺序。因为LinkedHashMap用双向链表维持内部数据。 static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after;//双向链表 Entry(int
2017-07-14 23:43:57
290
原创 WeakHashMap
WeakHashMap继承AbstractMap,实现了Map接口。WeakHashMap内部使用了数组、队列的结构。 private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> { V value; final int hash;
2017-07-13 17:53:44
418
原创 TreeMap
TreeMap继承AbstractMap,实现了NavigableMap, Cloneable, java.io.Serializable接口//TreeMap内部使用红黑树维护数据static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V>
2017-07-13 15:27:01
358
原创 HashTable
HashTable继承了Dictionary,实现了Map,Cloneable, java.io.Serializable接口。 HashTable内部比较重要的方法有get(Object key),put(K key, V value),rehash(),addEntry(int hash, K key, V value, int index),remove(Object key)HashTa
2017-07-12 14:05:31
405
原创 LinkedList
LinkedList继承了AbstractSequentialList,实现了 List, Deque, Cloneable, java.io.Serializable接口,Deque接口继承了Queue接口,所以LinkedList也是一个队列。 LinkdeList内部以Node为核心对内部的数据进行维护。 //链表实现 private static class Node<E>
2017-07-06 22:18:09
394
原创 ArrayList
List是我们常用到的集合类,JDK文档描述 All Superinterfaces: Collection, Iterable All Known Implementing Classes: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayL
2017-07-03 22:58:41
331
原创 简单实现生产者消费者问题
生产者消费者问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程--即所谓的“生产者”和“消费者”在实际运行时会发生的问题。。生产者主要的作用是生产一定量的数据放置到缓冲区,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。 该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。话不多说,直接上代码/** * 馒头对象
2017-05-02 16:09:17
770
原创 正则表达式匹配两个特殊字符中间的内容
今天在使用正则表达式中,要匹配两个字符中间的内容,一时没有写出来,后来在网上找到了,记录一下。 匹配两个字符串A与B中间的字符串包含A与B: 表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个) 示例: Abaidu.comB 结果: Awww.apizl.comB 匹配两个字符串A与B中间的字符串包含A但是不包含B: 表达式: A.*?(?=B) 示例: Awww.a
2017-04-27 17:31:12
46933
11
原创 装饰器模式
今天学习了装饰器模式,总结一下:百度百科对装饰器模式的解释:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。其要点是 1. 不改变原类文件 2. 尽量少用继承 3. 动态扩展装饰模式的特点 (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 (2) 装饰对象包含一个真实
2017-04-18 17:34:07
351
原创 回调函数
回调函数: 个人理解为:方法B.b()存在的目的就在于让方法A.a()去调用,以达到方法A.a()所想要的效果。public class DirList { public static void main(String[] args) { File path = new File("."); String[] list; if(args.len
2017-04-14 17:49:41
342
原创 懒汉模式和饿汉模式
今天在看《java编程思想》的访问权限控制一章中,里面讲到private关键字,一个单例模式,原来看过这种写法,但是一直不明白其中的道理,看过之后就明白了。下面是这个栗子public class Single { private static Single single = new Single(); private Single() {} public static Single
2017-03-29 11:15:26
753
原创 对象的创建过程
对象的创建过程jvm查找类的路径,定位到.class文件载入.class文件,有关静态初始化的所有动作都会被执行(静态初始化只在对象首次加载的时候进行一次)当用new创建对象的时候,在堆上为对象分配足够的空间存储空间将会被初始化,自动为对象的所有基本数据类型设置成默认值,引用被置为null执行所有出现于字段定义处的初始化动作执行构造器public class A { A(){
2017-03-28 17:34:48
504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人