策略模式,列舉的應用和區別

2021-09-27 08:01:46 字數 4293 閱讀 5327

在閱讀前需要對策略模式、狀態模式、列舉有所了解。

檔案分享,分享表需要記錄分享期限,簡化表結構如下

表share id

time_limit

create_time

id為主鍵,time_limit為分享期限,有1,2,3三個值,其中1代表永久,2代表一周,3代表一天,create_time分享建立時間。

表share_resource id

share_id

resource_id

id為主鍵,share_id為分享表的id,resource_id為檔案的id,分享和檔案為多對多的關係。

查詢到一條share記錄後,需要計算當前的分享是否過期。

如果需要測試以下**將所有的share share = shareservice.getbyuserid(userid);替換為share share = new share();

根據share表結構新建乙個class share自定義屬性即可。

@controller

public share getshare(string userid)

return null;

}// 判斷是否分享是否過期

private boolean isvalidshare(share share)else if(timelimit.equals(2))

// 計算天數

if(day == 0)

if(system.currenttimemillis() < createtime.gettime() + day * 24 * 60 * 60 * 1000)

return false;

}

通過以上**,如果我想增加乙個時間限制型別,如分享期限為乙個月,那麼我就需要在原來的if else中再新增乙個if else。

// 將資料庫資料轉化為實際計算的天數

if(timelimit.equals(1)) else if(timelimit.equals(2)) else if(timelimit.equals(4))

顯然,在原來的**上增加乙個if else這不符合上面的原則。

策略類

/**

*抽象父類

*/public abstract class counttimestrategy

return system.currenttimemillis() < createtime.gettime() + getday() * 24 * 60 * 60 * 1000;

}}/*

* 「一天」的實現類

*/public class onedaystrategy extends counttimestrategy}/*

* 「一周」的實現類

*/public class weekstrategy extends counttimestrategy}/*

* 「永遠」的實現類

*/public class foreverstrategy extends counttimestrategy

}

controller

@controller

public share getshare(string userid)

return null;

}// 判斷是否分享是否過期

private boolean isvalidshare(share share)else if(timelimit.equals(2)) else if(timelimit.equals(3))

return counttimestrategy.isvalid(timelimit)

}

雖然策略模式已經把實現抽離了主方法,但還是免不了使用if else,免不了if else,就無法很好的對修改關閉,究其原因是因為程式無法自動判斷使用哪個實現類。

我的解決辦法是使用map,在counttimestrategy中新增乙個key為判斷條件,value為實現類的map,修改後**如下

/**

*抽象父類

*/public abstract class counttimestrategy

return system.currenttimemillis() < createtime.gettime() + getday() * 24 * 60 * 60 * 1000;

}}/*

* 「一天」的實現類

*/public class onedaystrategy extends counttimestrategy

@override

int getday()}/*

* 「一周」的實現類

*/public class weekstrategy extends counttimestrategy

@override

int getday()}/*

* 「永遠」的實現類

*/public class foreverstrategy extends counttimestrategy

@override

int getday()

}

controller

@controller

public share getshare(string userid)

return null;

}// 判斷是否分享是否過期

private boolean isvalidshare(share share)

使用map後就可以通過key獲取對應的實現類了,這時候當我們需要新增乙個月的期限時就不需要修改任何**,只需要新建乙個counttimestrategy的子類即可,如下

擴充套件分享期限「乙個月」

/*

* 「一月」的實現類

*/public class monthstrategy extends counttimestrategy

@override

int getday()

}

看到這裡會發現對於不同的timelimit會有不同的day來對應,使用策略模式有點小題大作了,完全可以使用map來解決,沒錯,策略模式是適用於方法實現不同的場景,而這裡的方法實現相同,唯一的不同就是引數day。

使用列舉和使用策略模式非常相似

public enum counttimeenum 

private integer day;

timelimitenum(integer day)

public boolean isvalid(share share)

if(system.currenttimemillis() < createtime.gettime() + day* 24 * 60 * 60 * 1000)else

}}

@controller

public share getshare(string userid)

return null;

}// 判斷是否分享是否過期

private boolean isvalidshare(share share)

列舉類中的各個例項的方法實現是一樣的,通過不同的引數得到不同的結果。

策略模式的各個策略方法除了可以輸入不同的引數,實現也可以不同,可以將相同的實現放在抽象父類,不同的實現由子類實現,更加靈活。

因為方法的引數為share,應用物件導向的思想應該把isvalidshare(share share)方法放入share類中。

public class share 

}

public enum counttimeenum 

private integer day;

timelimitenum(integer day)

public boolean isvalid(date createtime)

if(system.currenttimemillis() < createtime.gettime() + day* 24 * 60 * 60 * 1000)else

}}

@controller

public share getshare(string userid)

return null;

}

策略模式(策略列舉)

首先定義乙個介面 package com.yecc.suanfa.strategy created by yecc on 2020 11 16 19 35 public inte ce strategy 定義三個繼承介面的類 package com.yecc.suanfa.strategy crea...

策略模式的擴充套件 策略列舉

各位,我給大家出個小學的題目 輸入3個引數,進行加減法運算,引數中兩個是int型的,剩下的乙個引數是string型的,只有 兩個符號可以選擇,不要考慮什麼複雜的校驗,我們做的是白箱測試,輸入的就是標準的int型別和合規的string型別,各位大俠,想想看,怎麼做,簡單得很!有非常多的實現方式,我今天...

策略模式之策略列舉

在使用策略模式時,我們要建立相應的策略,然後根據不同的場景使用不同的策略,這是可以的,但畢竟那是一堆的策略類,使用起來 的可讀性 擴充套件性也就一般,這種情況下我們可以使用策略模式的公升級版 策略列舉來解決上邊的問題 列舉類 public enum strategyenum sub muti str...