乙個最簡單的裝飾模式

2021-03-31 08:56:30 字數 1808 閱讀 5971

如果要對乙個list中的元素排序,如果list中的元素是可排序的(實現了***apable),直接collections.sort(list).

如果要指定排序演算法,可以使用***parator,可以參考:

collections.sort是按公升序排序的,如果要按降序呢?其實很簡單,只要自己重新定義乙個***parator就可以了.

list list=new arraylist();

list.add(new integer(3));

list.add(new integer(53));

list.add(new integer(34));

collections.sort(list); //這個是公升序

collections.sort(list,collections.reverseorder());//這個是降序

上面的是對於可排序的元素,對於不可排序的元素呢?

list list= new arraylist();

list.add(new object());

list.add(new object());

list.add(new object());

collections.sort(list,new ***parator()) //這個是公升序

collections.sort(list,new ***parator()) //這個是降序

沒理由這麼複雜呀,如果比較的時候比較麻煩(可能需要比較好幾個屬性),難道也這麼寫?

這裡我們先看看collections.reverseorder是怎麼實現的:

private static final ***parator reverse_order = new reverse***parator();

看看這個內部類的定義:

private static class reverse***parator implements ***parator,serializable

}好簡單吧,但是這個***parator只能對那些實現了***parable介面的使用.

我們可以自己寫乙個更簡單的,比較改乙個函式***pare嗎?改變符號就行了.

public class reverse***parator implements ***parator,serializable  

public int ***pare(object o1,object o2)   

}

就這麼簡單!這個也算是設計模式嗎?難道設計模式很複雜嗎?

好了,以後要排序就可以這樣了

***parator ***p=....;

collections.sort(list,***p);//公升序

collections.sort(list,new reverse***parator(***p));//降序

這裡注意:

1.***pare方法如果這樣寫也可以:

if(cmp<0) return -1;

else if(cmp>0) return 1;

else return 0;

但是效率相對差一些.

2.為什麼不能返回直接返回-cmp?

這個應該是理所當然的呀,但是 -integer.min_value=integer.min_value.

也就是1000...000=-1000...000,就因為這一種情況所以不能直接返回-cmp,其實這樣的

情況機會不會發生,即使直接返回-cmp大部分情況也不會出問題.

裝飾者模式 乙個簡單的裝飾函式

裝飾者模式 decorator 在不改變原物件的基礎上,通過對其進行包裝拓展 新增屬性或者方法 使原有物件可以滿足使用者更複雜的需求。乙個簡單的栗子 需求 為輸入框繫結新事件而不影響原有事件 var decorator function input,fn else do something 使用,裝...

實現乙個簡單的裝飾器

下面示例定義了乙個裝飾器,它會在每次呼叫被裝飾的函式時計時,然後把經過的時間 傳入的引數和呼叫的結果列印出來。import time defclock func def clocked args t0 time.perf counter result func args elapsed time.p...

ajax最簡單的乙個例項

最近在學習ajax的一些東西,下面是學習時寫的乙個最簡單的例子。href.html是頁面靜態檔案。ajax.js是js指令碼。for.php是要呼叫的php指令碼。如下 href.html檔案 如下 hopelightsbt ajax.js 如下 判斷瀏覽器是否支援xmlhttprequest物件 ...