原型模式即对对象进行拷贝,快速在Java内存堆中创建一个新的对象,按照对象的引用类型是否一起拷贝复制分为深拷贝和浅拷贝,深拷贝会把对象的引用类型也在内存中创建出一个新的对象,而浅拷贝不会创建新的引用类型对象,因此浅拷贝出的新对象的引用对象指向还是原先的同一引用对象;
适配器模式
适配器模式主要解决当客户端需要使用一个已有的目标类时,该目标类的功能可以满足客户端的需要,但是该目标类所提供的接口无法让客户端直接使用,因此需要对目标类进行转换适配,使得无需改变其结构方法即可被客户端直接使用;如何实现不改变目标类的方法,而同时又能满足现有客户端的要求呢;解决办法就是引入一个适配器类,让适配器类提供客户端需要的接口,同时适配器内部依赖目标类,客户端只需要耦合适配器类,这样当客户端调用适配器方法时,实际上是去委托给目标类进行处理,而在此过程中,客户端与目标类没有发生耦合;适配器模式主要有依赖和继承两种方式,而又继承之间的需要强烈的”is a”的关系,因此实际使用中以依赖委托的方式居多;下面看一个案例:
系统中包含AdvancedUser和Admin两个不同权限的用户类,AdvancedUser具有一个login登录的方法, Admin具有一个更高优先级的删除用户deleteUser的方法:
1 | public class AdvancedUser { |
建造者模式
建造者模式是把一个复杂对象的创建过程给结构化,当创建一个对象需要的参数大于5个,并且参数还可选的时候,如果使用构造器来区分,会使类的构造函数很多,使用起来非常混乱,并且对于部分必选参数,没办法进行合理控制,因此我们可以把一个复杂度对象的创建给结构化,分门别类的构建不同的部分,传统建造者模式的类图如下所示:
LeetCode.解码方法
一条包含字母A-Z的消息通过以下方式进行了编码:’A’ -> 1,’B’ -> 2,…,’Z’ -> 26; 给定一个只包含数字的非空字符串,请计算解码方法的总数。题目数据保证答案肯定是一个32位的整数。
LeetCode.子集II
给定一个可能包含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。
面向对象编程OOP基本原则
单例模式
工厂模式
LeetCode.合并两个有序数组
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。格雷编码序列必须以0开头。
LeetCode.合并两个有序数组
给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素。