最近小白在看 Spring IOC 和 AOP 源碼時發現 Spring 中有不少類都實現了同一個接口,像下面這種java
public interface AopProxy {
Object getProxy();
Object getProxy(@Nullable ClassLoader classLoader);
}
複製代碼
final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {
private static final long serialVersionUID = 5531744639992436476L;
// 略...
}
複製代碼
@SuppressWarnings("serial")
class CglibAopProxy implements AopProxy, Serializable {
// 略...
}
複製代碼
此種方式是如何實現的小白還不清楚,但確定知道是 Spring 框架搞的鬼;因此小白就在網上找到了一圈、本身能看懂的一段代碼,而後照着網上的寫法,本身寫了一個關於排序算法的調用,以供參考:算法
1、枚舉排序類型bash
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:51 * @Description 排序類型 */
public enum SortType {
SELECTION,
BUBBLE,
INSERT,
}
複製代碼
2、編寫一個排序接口,調用入口app
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:15 * @Description 排序 */
public interface Sort {
SortType getSortType();
int[] sorting(int[] sourceArray);
}
複製代碼
3、編寫幾個常見的排序算法
(1)、冒泡排序框架
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:15 * @Description 冒泡排序 */
@Component
public class BubbleSort implements Sort {
@Override
public SortType getSortType() {
return SortType.BUBBLE;
}
@Override
public int[] sorting(int[] sourceArray) {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
}
複製代碼
(2)、插入排序ide
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:17 * @Description 插入排序 */
@Component
public class InsertSort implements Sort {
@Override
public SortType getSortType() {
return SortType.INSERT;
}
@Override
public int[] sorting(int[] sourceArray) {
// 7, 2, 4, 6, 3, 9, 1
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
printArr(arr);
// 從下標爲1的元素開始選擇合適的位置插入,由於下標爲0的只有一個元素,默認是有序的
for (int i = 1; i < arr.length; i++) {
// 記錄要插入的數據
int temp = arr[i], j = i;
// 從已經排序的序列最右邊的開始比較,找到比其小的數
while (j > 0 && temp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
// 存在比其小的數,插入
if (j != i) {
arr[j] = temp;
}
printArr(arr);
}
return arr;
}
private void printArr(int[] arr) {
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1) {
System.out.print(arr[x] + ", ");
} else {
System.out.println(arr[x]);
}
}
}
}
複製代碼
(3)、選擇排序測試
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:16 * @Description 選擇排序 */
@Component
public class SelectionSort implements Sort {
@Override
public SortType getSortType() {
return SortType.SELECTION;
}
@Override
public int[] sorting(int[] sourceArray) {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 總共要通過 N-1 輪比較
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每輪須要比較的次數 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 記錄目前能找到的最小值元素的下標
min = j;
}
}
// 將找到的最小值和i位置所在的值進行交換
if (i != min) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
return arr;
}
}
複製代碼
4、排序工廠,實現 ApplicationContextAware 接口this
/** * @author zhugu * @version 1.0 * @Date 2019/4/17 14:56 * @Description 排序工廠 */
@Component
public class SortFactory implements ApplicationContextAware {
private static Map<SortType, Sort> sortBeanMap = new ConcurrentHashMap<>(16);
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, Sort> map = applicationContext.getBeansOfType(Sort.class);
map.forEach((key, value) -> sortBeanMap.put(value.getSortType(), value));
}
public int[] sorting(SortType sortType, int[] sourceArray) {
Sort sort = sortBeanMap.get(sortType);
return sort.sorting(sourceArray);
}
}
複製代碼
5、測試spa
@RestController
public class SortController {
private final SortFactory sortFactory;
public SortController(SortFactory sortFactory) {
this.sortFactory = sortFactory;
}
@PostMapping(value = "factory/sort")
public Object sortFactory(SortType sortType, int[] sourceArr) {
return sortFactory.sorting(sortType, sourceArr);
}
}
複製代碼
響應參數:code
[
1,
4,
6,
6,
46,
46,
54,
54,
65,
65,
74,
85,
465,
879,
9874
]
複製代碼