在閱讀前需要對策略模式、狀態模式、列舉有所了解。
檔案分享,分享表需要記錄分享期限,簡化表結構如下
表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...